启动交易模型,并构建 EA+ x; d) q2 B& `& |5 d8 h
在解决系统品质因数之前,有必要创建一个能在测试中使用的基本系统。 我们选择了一个简单的系统:我们先选择一个随机数字,若它是偶数,我们就开仓做多;否则,我们开仓做空,因为数字是奇数。. k' |4 p- L2 C
为了保持随机抽取,我们调用 MathRand() 函数,它提供一个介于 0(零)至 32767 之间的数字。 此外,为了令系统更加平衡,我们将添加两条互补规则。 有了这三条规则,我们将努力确保系统更加可靠。
1 J5 i% y( W3 ^( g! }7 ]; b2 e以下是制定这些规则的代码。
2 c+ x: T/ ^$ z5 |- B2 ]% x//--- Indicator ATR(1) with EMA(8) used for the stop level...
4 p8 E- o; S, u1 S' s+ oint ind_atr = iATR(_Symbol, PERIOD_CURRENT, 1);
/ n2 F5 ^0 }0 N9 {4 U/ N0 f2 zint ind_ema = iMA(_Symbol, PERIOD_CURRENT, 8, 0, MODE_EMA, ind_atr);8 o1 V. u1 q% A) E T( O* x& o
//--- Define a variable that indicates that we have a deal...
/ S- T- V( {3 d# k1 o. sbool tem_tick = false;
% O) k& y% W; o4 B# u' f. }//--- An auxiliary variable for opening a position
% H* Y/ W2 m1 ^- z+ C#include<Trade/Trade.mqh>& x1 W o. T% v& ^
#include<Trade/SymbolInfo.mqh>
2 a9 C) P4 g2 V4 K/ t9 }0 Q* f# qCTrade negocios;5 G8 l0 v* g; u. w: Q! h3 }: S* p
CSymbolInfo info;- ~3 s$ }8 \6 Z ?6 e
//--- Define in OnInit() the use of the timer every second U$ e0 n3 |, b# t: V1 N/ y
//--- and start CTrade
$ X Y% D$ r6 fint OnInit(): _8 M2 {2 q) N; W5 M, s e
{: ]$ e3 o2 w" x/ T1 |% Y5 u
//--- Set the fill type to keep a pending order4 m) q9 V/ h5 Q
//--- until it is fully filled3 c2 K5 r: R0 ~+ L8 I$ q
negocios.SetTypeFilling(ORDER_FILLING_RETURN);4 M: W% Q8 g+ u1 w
//--- Leave the fixed deviation at it is not used on B3 exchange( C) m, J; Q0 t0 s0 N: f
negocios.SetDeviationInPoints(5);
9 j9 m# d B! z3 w# `' q; \4 b" e//--- Define the symbol in CSymbolInfo...* ^7 V! J3 {0 A6 v( Y4 }
info.Name(_Symbol);
" u1 g* |2 n/ s- R+ O//--- Set the timer...
5 Z2 W) d$ k2 u9 kEventSetTimer(1);
1 L8 u* P u0 k//--- Set the base of the random number to have equal tests...: B) _3 x" l0 j' ?
MathSrand(0xDEAD);
& X1 t- ^2 W8 ~& z n$ Greturn(INIT_SUCCEEDED);
0 v: O1 E0 ^" o! C, {3 x* j" ] ?}/ P2 @# ^) {- }$ a- Y2 o0 C- E! {
//--- Since we set a timer, we need to destroy it in OnDeInit().# E) G' Y3 |3 o G
void OnDeinit(const int reason)
# r* r0 I; Q% M" S, R8 f9 I{
8 U- C+ } N- P1 W7 S, yEventKillTimer();
C- e8 L6 ?- @/ ]8 l8 ]* s* ?1 Y}
( I' d J& \# C) g" b" w" k//--- The OnTick function only informs us that we have a new deal
1 r# _$ S! ~* m3 @" i' e6 | H) Avoid OnTick()2 Y7 s* u4 I1 l0 t2 t7 T3 ^
{' b) K Q" |6 d/ M% h
tem_tick = true;4 @. {" A) i* T+ u) m% {
}: i" U# {8 g S$ f. L5 c* x- C8 E
//+------------------------------------------------------------------+* h3 f5 P ^* k/ s' _0 w( y; m
//| Expert Advisor main function | G( Q1 \4 p; e4 w7 n
//+------------------------------------------------------------------+. D! k! a5 J2 }+ U% a; T
void OnTimer()
+ Z3 p2 k, M# ^3 B{
+ d7 o6 _* b3 JMqlRates cotacao[];
" v; T' \3 C1 t, q# A) kreturn ;
& Q9 X" r" G, k1 b$ n, \if (negocios_autorizados == false) // are we outside the trading window?
% `7 j4 H0 d$ G, qreturn ;
! W8 u- U1 @4 C0 h% e' s! w' K! M9 [//--- We are in the trading window, try to open a new position!% s0 M$ ]" R# K% l
int sorteio = MathRand();
' K) Z8 y1 i) Z6 s2 c! U//--- Entry rule 1.1
' o5 I. X1 P* U& T+ l6 b( \if(sorteio == 0 || sorteio == 32767)6 F+ |" z! u% J/ K1 a) g8 `( {
return ;3 c# [! E% R+ o, K
if(MathMod(sorteio, 2) == 0) // Draw rule 1.2 -- even number - Buy' k, t1 X/ |) |8 u3 | h% w2 ]3 D$ d
{
7 V% N& y/ r' Bnegocios.Buy(info.LotsMin(), _Symbol);( d2 K6 ^* k* W8 {. q# p/ o
}
2 O$ s. E) C0 Selse // Draw rule 1.3 -- odd number - Sell& H" J D' s H7 I( B) s& s
{
' Q9 \0 _- V, Y1 X, I9 [+ Jnegocios.Sell(info.LotsMin(), _Symbol);
* I- W* K: ^& {5 f}
; p( e5 c: ?+ n" P& v. B0 O; D}
! G4 s$ E' Q2 E S' t( _- e) }//--- Check if we have a new candlestick...
% [4 L5 o& P2 V. kbool tem_vela_nova(const MqlRates &rate)
x# I0 \* N/ {. O9 t) E{* e0 K9 |3 E4 X
{6 q+ {' k& f2 q. w G0 y" \
ret = true;( F% z8 p, ?. `: d) U
close_positions = false;3 M) M! |% |- p% R, `
}
K* [% Z' G& g3 W9 Welse
: }0 R$ r! b8 Q" h6 k% V( T{9 l# A5 L% p7 M& a/ U" v
if(mdt.hour == 16)# _ |" } i3 H) n
close_positions = (mdt.min >= 30);3 `# i Y7 {) m' Y p
}
4 @7 H. ^ g1 V. `4 {5 Y! Y9 Z}
3 V* M- F5 ] I% Z8 n9 Treturn ret;0 J3 n6 U$ r" z$ e
}% v7 `. L( z; Q& K, S# R; C
//---( r) Q% r/ l6 j( q$ U4 q$ N
bool arruma_stop_em_posicoes(const MqlRates &cotacoes[])
& j0 S. D" z5 g' f( F{, F0 p1 h6 D( x3 j# x9 s0 ?
if(PositionsTotal()) // Is there a position?' X4 V. h7 d8 {1 j4 Q
{' l% V: K# f7 ~/ b, z" h, Y
double offset[1] = { 0 };
$ {( {6 p: g# y$ t" G! Pif(CopyBuffer(ind_ema, 0, 1, 1, offset) == 1 // EMA successfully copied?: M. o0 W8 X; I! [
&& PositionSelect(_Symbol)) // Select the existing position!
8 P( I; F( S3 g{
# |' F1 m' H, E) T& X* ?9 _ENUM_POSITION_TYPE tipo = (ENUM_POSITION_TYPE) PositionGetInteger(POSITION_TYPE);
" Z4 E) y2 z6 Bdouble SL = PositionGetDouble(POSITION_SL);
! U. C7 v: R5 S( r5 t; O1 Tdouble TP = info.NormalizePrice(PositionGetDouble(POSITION_TP));
" K1 y$ i3 U' f1 V2 v5 N& L0 Wif(tipo == POSITION_TYPE_BUY)4 U5 h+ X+ q/ [( [& C6 S7 h; x
{3 k' t4 _ H7 m8 C* R, S
if (cotacoes[1].high > cotacoes[0].high)9 x: W; Q6 Q2 b! [! T5 c
{
# r7 v1 x2 o* Odouble sl = MathMin(cotacoes[0].low, cotacoes[1].low) - offset[0];4 s1 ]* C7 h. ^8 F
info.NormalizePrice(sl);$ v! z) x4 N5 \8 W7 N' I
if (sl > SL)
a* J6 G$ Y5 P8 R) Z+ ^{, X4 b L9 B& `/ _7 F- J0 i
negocios.PositionModify(_Symbol, sl, TP);
5 c3 e! E5 m8 J+ R5 ]) N8 B}
' X" h7 Y2 @5 \) y}, C' V f4 C0 `' e. X0 o* ?
}
- u4 t3 K. C# o7 m. Q: Qelse // tipo == POSITION_TYPE_SELL3 x+ I# |* t# k* H1 p; o' H
{
! Z! y1 t! A% q3 Bif (cotacoes[1].low < cotacoes[0].low) `7 k+ ?; B. Z4 I
{; }- x" Y* z; h8 J$ O/ o# J+ Q) u
return true;
9 O, z) x5 K* p+ X) S}' L8 n4 }- o+ q5 y, ? q
// there was no position
1 R) O. ^5 e+ v. x. n% ireturn false;! G% E! W) m, ^8 d' w
}
+ w0 w9 R( o* x0 ` t我们简略研究一下上面的代码。 我们将经均化计算的 ATR 值来判定止损步长,即我们发现当前烛条超过前一根时,将止损价位放置在烛条的边界。 这是在函数 arruma_stop_em_posicoes 中完成的。 当其返回 true 时,已有设置,且我们无需在 OnTimer 的主代码中前进。 我使用该函数取代 OnTick,因为我不需要针对每笔执行的交易运行一遍大函数。 函数应该在所定义周期的每根新烛条建立时执行。 在 OnTick 中,设置 true 值表示前一笔交易。 这是必要的;否则,在休市期间,策略测试器将引入暂停,因为即使没有前一笔的交易,它也会执行该函数。
7 u8 r: M' C# u- q9 O% |4 l2 p到该处为止,一切都严格按照定义好的计划进行,包括两个指定的窗口。 第一个是开仓交易的窗口,在 11:00 到 4:00 之间。 第二个是管理窗口,它允许算法管理持仓,移动其止损价位,直至 16:30 — 此时它应该把当天的所有交易了结。 |