私募

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz

期货量化软件:赫兹量化中为智能系统制定品质因数

[复制链接]
发表于 2024-3-31 08:42:56 | 显示全部楼层 |阅读模式
启动交易模型,并构建 EA" \$ U3 {/ V( r! P* G3 n% @
在解决系统品质因数之前,有必要创建一个能在测试中使用的基本系统。 我们选择了一个简单的系统:我们先选择一个随机数字,若它是偶数,我们就开仓做多;否则,我们开仓做空,因为数字是奇数。+ l% o( x' U8 U. _3 l" `
为了保持随机抽取,我们调用 MathRand() 函数,它提供一个介于 0(零)至 32767 之间的数字。 此外,为了令系统更加平衡,我们将添加两条互补规则。 有了这三条规则,我们将努力确保系统更加可靠。
. k8 i% c  o! A以下是制定这些规则的代码。/ I0 [3 w! G' X  M* P% Z  K; D8 j
//--- Indicator ATR(1) with EMA(8) used for the stop level...: v* n3 |, E5 J" j
int ind_atr = iATR(_Symbol, PERIOD_CURRENT, 1);/ Y- G. a9 ^( s* }$ r
int ind_ema = iMA(_Symbol, PERIOD_CURRENT, 8, 0, MODE_EMA, ind_atr);
+ L5 k  N  h% e% a//--- Define a variable that indicates that we have a deal..., s  q" J! I4 ~1 G- U9 M  j6 ]
bool tem_tick = false;
/ b9 G; a# H( l//--- An auxiliary variable for opening a position3 k, b; m' e. L3 T
#include<Trade/Trade.mqh>/ a5 ?& x! X4 S0 @9 _8 o8 D! u  y& {
#include<Trade/SymbolInfo.mqh>- e3 T1 E, C% T. s5 h
CTrade negocios;
$ y; y% N9 P* `, q' F8 H$ z! pCSymbolInfo info;
& p3 l- w# m9 L, Q//--- Define in OnInit() the use of the timer every second
2 I& V8 E8 _; J  x! M4 F+ b//--- and start CTrade
9 s- b# ~  c; c. m* J1 ^int OnInit()
6 r8 I' \+ T7 K, T{2 a1 b# W1 _4 e
//--- Set the fill type to keep a pending order
" v2 @* R$ T; h' O# w//--- until it is fully filled' H) O$ H- P9 P0 b$ r
negocios.SetTypeFilling(ORDER_FILLING_RETURN);
0 i6 |/ q4 K) ?8 A( |//--- Leave the fixed deviation at it is not used on B3 exchange2 U5 F" ]0 p5 k! e/ x
negocios.SetDeviationInPoints(5);
+ I( i- h# [) z( w//--- Define the symbol in CSymbolInfo.... T5 e2 y4 P0 F) C& l; M/ S8 s
info.Name(_Symbol);& m, C+ Q4 F2 A1 `
//--- Set the timer...
. e! H" ^1 A9 W; ]5 O: Q7 zEventSetTimer(1);0 J( _& o  S8 I
//--- Set the base of the random number to have equal tests..., A1 |) ~& B6 a8 u" g- k. g+ Y
MathSrand(0xDEAD);
1 i% s1 x" r3 W/ h& s% |: g1 {return(INIT_SUCCEEDED);
/ R  E9 {+ p! ~' L8 C- L}6 W: w  J0 a; y
//--- Since we set a timer, we need to destroy it in OnDeInit().
) z, o* m, n9 N, A/ b& J! r! H- ?void OnDeinit(const int reason)
- D! x4 Z1 e) D{
* N7 J6 ~6 a3 s5 s( x3 n4 WEventKillTimer();  r2 t9 a5 T2 `: Y0 c7 ~7 F
}
/ r  ^7 n& A' @3 N/ q4 A8 M+ v//--- The OnTick function only informs us that we have a new deal
/ U. y2 s, q. v' G1 }void OnTick()
1 H8 T. N/ ]8 p- `! l{1 {, ^' v  k1 g2 C! f% B! d
tem_tick = true;
5 u" K7 i3 D. X7 X2 W4 h$ q}
& M# ?# Q3 [# I//+------------------------------------------------------------------+
" k# D' I  p: ?+ S//| Expert Advisor main function                                     |
+ a! g4 B% \; W- q9 [//+------------------------------------------------------------------+
' G) l3 z4 y4 Uvoid OnTimer()* O( A. b& N4 _7 b4 V
{
5 U& z* [5 |8 B- dMqlRates cotacao[];+ G1 r8 W2 ?0 `) |1 t. q6 N
return ;
, S1 c9 F: g: Bif (negocios_autorizados == false) // are we outside the trading window?9 j3 o5 @) k; J  c
return ;. a" a$ Y: F5 P0 {
//--- We are in the trading window, try to open a new position!
0 A# T. E$ P# I; F$ ?% U% {int sorteio = MathRand();' Y" Y" {: q7 ?
//--- Entry rule 1.1
) S& O$ n2 O& Xif(sorteio == 0 || sorteio == 32767)
+ q- E6 P$ d% z+ `( _- Greturn ;# Z" a8 E  O+ W, I, \3 e
if(MathMod(sorteio, 2) == 0)  // Draw rule 1.2 -- even number - Buy9 F3 Q0 M$ D2 I" z
{
3 L0 V" p5 G3 G/ f" `# Rnegocios.Buy(info.LotsMin(), _Symbol);5 Z# F- W% ~$ v$ d' H( ~
}( I7 t3 c* _( A3 S  `) B2 g- [% _
else // Draw rule 1.3 -- odd number - Sell3 T+ i, N; v1 |9 E- n( Q
{4 x6 O4 C2 L0 f8 O# I% X& p8 H2 l5 |
negocios.Sell(info.LotsMin(), _Symbol);
; ?5 |$ p2 h  j6 f( d" G& M}
) q6 P2 O3 n6 H: L}- Q# \9 ^& a* ~  h
//--- Check if we have a new candlestick...5 x" y7 g. N) J) K+ I# l! n& P3 r, x
bool tem_vela_nova(const MqlRates &rate)
( Z( ]3 M& n3 x0 ~{
$ v' L5 p2 n2 A/ w$ K/ @- g{
$ o' M7 t  E" N/ ^, @* S% q% p+ Rret = true;
6 O5 Y6 u% f' X  z1 S3 _close_positions = false;
- r5 O+ H0 Q% }! K/ V# `" M}- J" `' H  j: p- |, y, G. l+ N% q9 y
else& W( n( k. Y/ L$ b3 a! ^
{; z8 |' m& M5 g* c
if(mdt.hour == 16)
" \/ g0 A- J7 e3 W1 b4 C7 Yclose_positions = (mdt.min >= 30);7 a$ l% M* c0 N$ q/ Q2 E) P; G2 j
}
* u) s% d. L. U: |0 L% B5 O}
; u# r# P: c- n# S. B. z0 O- H# Mreturn ret;
' L5 _6 B* q  N$ Z9 c' v2 c}0 S4 X9 F) w1 m* l" T: V
//---0 r0 I+ o- x$ ?6 q
bool arruma_stop_em_posicoes(const MqlRates &cotacoes[])
2 ^* X+ H9 D! D' e$ B, @{! j7 O+ D9 F, I; b2 R  ~% d& j
if(PositionsTotal()) // Is there a position?
: }) q# O: p3 ^9 ]{. o1 A4 `' X- w# R
double offset[1] = { 0 };
# U0 {1 z* C+ T4 jif(CopyBuffer(ind_ema, 0, 1, 1, offset) == 1 // EMA successfully copied?
# O+ O) b, K) W6 d&& PositionSelect(_Symbol))  // Select the existing position!! O$ g& x& X' }
{8 r9 j1 s" K9 w  P4 z8 n. q
ENUM_POSITION_TYPE tipo = (ENUM_POSITION_TYPE) PositionGetInteger(POSITION_TYPE);# Q7 Q; V* {% H! R" \: d
double SL = PositionGetDouble(POSITION_SL);
1 |+ J; @9 X. Tdouble TP = info.NormalizePrice(PositionGetDouble(POSITION_TP));
$ ~5 }+ Y5 d; V: ^  Q( uif(tipo == POSITION_TYPE_BUY)2 j  i: R6 N5 q/ @4 O  z
{- r  G% w' E$ O
if (cotacoes[1].high > cotacoes[0].high)
6 D- C+ k0 F5 E  ]5 f7 M" N{% ~: b! M3 |6 p1 r: ~& g. J# n7 m
double sl = MathMin(cotacoes[0].low, cotacoes[1].low) - offset[0];
! \7 Y5 f: i8 D+ F5 u8 f3 V9 }$ j- ]info.NormalizePrice(sl);
3 A6 F5 [. M7 S4 z/ [# I' n2 K, U- fif (sl > SL)
( V; \' [" Q1 F; R" E0 ?( f{
6 ?. a1 S- h! L4 ]  Z+ [negocios.PositionModify(_Symbol, sl, TP);
, e: m$ [1 M6 K/ E8 c2 D* _9 b}
! @) w2 T% [4 L$ G9 x}: h+ E/ N3 r. m) v
}; v9 ?# a# d2 B3 w) a( q& a. w: q' X
else // tipo == POSITION_TYPE_SELL/ c0 {+ `" b7 ~" R
{% r& P$ e6 p/ C9 ^
if (cotacoes[1].low < cotacoes[0].low)
& x* }+ N2 t. Y: C+ o* l; ]+ g; t+ a{7 y2 I9 u, F' A7 F
return true;2 k' D& E2 I8 M9 J# |' g
}8 N& \+ w$ q1 d, `5 H+ }: f; F
// there was no position
& h( \, l& Y0 Q) rreturn false;
( [) z- A3 b+ S1 R}1 u. B+ O# H$ [  A# {% [- C
我们简略研究一下上面的代码。 我们将经均化计算的 ATR 值来判定止损步长,即我们发现当前烛条超过前一根时,将止损价位放置在烛条的边界。 这是在函数 arruma_stop_em_posicoes 中完成的。 当其返回 true 时,已有设置,且我们无需在 OnTimer 的主代码中前进。 我使用该函数取代 OnTick,因为我不需要针对每笔执行的交易运行一遍大函数。 函数应该在所定义周期的每根新烛条建立时执行。 在 OnTick 中,设置 true 值表示前一笔交易。 这是必要的;否则,在休市期间,策略测试器将引入暂停,因为即使没有前一笔的交易,它也会执行该函数。; W& u9 M7 \: l7 W% v
到该处为止,一切都严格按照定义好的计划进行,包括两个指定的窗口。 第一个是开仓交易的窗口,在 11:00 到 4:00 之间。 第二个是管理窗口,它允许算法管理持仓,移动其止损价位,直至 16:30 — 此时它应该把当天的所有交易了结。
http://www.simu001.cn/x287863x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Archiver| ( 桂ICP备12001440号-3 )|网站地图

GMT+8, 2025-11-26 14:27 , Processed in 0.422889 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表