私募

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

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

[复制链接]
发表于 2024-3-31 08:42:56 | 显示全部楼层 |阅读模式
启动交易模型,并构建 EA  n- W& ~$ c+ N9 A6 W
在解决系统品质因数之前,有必要创建一个能在测试中使用的基本系统。 我们选择了一个简单的系统:我们先选择一个随机数字,若它是偶数,我们就开仓做多;否则,我们开仓做空,因为数字是奇数。: I. V8 {2 V* o3 p
为了保持随机抽取,我们调用 MathRand() 函数,它提供一个介于 0(零)至 32767 之间的数字。 此外,为了令系统更加平衡,我们将添加两条互补规则。 有了这三条规则,我们将努力确保系统更加可靠。4 J: _$ n. [, D2 N) _) ~
以下是制定这些规则的代码。" P" n) Z' \7 P# L8 u
//--- Indicator ATR(1) with EMA(8) used for the stop level...
# v* O$ u) A0 s- \int ind_atr = iATR(_Symbol, PERIOD_CURRENT, 1);- K1 Z9 ]& }& A9 T0 o8 E
int ind_ema = iMA(_Symbol, PERIOD_CURRENT, 8, 0, MODE_EMA, ind_atr);* ?7 @; l7 c* O
//--- Define a variable that indicates that we have a deal...3 S, K9 V0 I$ J/ v" y
bool tem_tick = false;6 u; n9 o5 U6 q6 A: J5 ^7 d, q
//--- An auxiliary variable for opening a position
2 f  f; _  o: p9 j' |9 |$ v#include<Trade/Trade.mqh>
) V1 \* O4 x5 D* ~: y. {# j& u#include<Trade/SymbolInfo.mqh>
: H- T. t( j) S# o3 v- [( eCTrade negocios;
! Y. z+ g: \( l. q  d: @: i8 [5 U5 wCSymbolInfo info;
, j5 u" ~3 u+ J/ w//--- Define in OnInit() the use of the timer every second
3 s- I; }1 u5 A7 q% E; P//--- and start CTrade
& {5 _3 p9 u# |1 u0 Xint OnInit()- ?! h: u. B$ X! \  k, \
{
4 E( V' j& g, U7 s6 g, j  v//--- Set the fill type to keep a pending order, o& _/ z6 F: _
//--- until it is fully filled
0 k( `% H9 Q7 W3 ~8 K8 rnegocios.SetTypeFilling(ORDER_FILLING_RETURN);
" U3 X" X! R% O4 ]//--- Leave the fixed deviation at it is not used on B3 exchange3 {- G+ T, u) T4 E" }$ Z
negocios.SetDeviationInPoints(5);
/ E  A0 P7 C$ K% E5 Q//--- Define the symbol in CSymbolInfo...& u& a6 p5 h0 r# Z
info.Name(_Symbol);
! U/ {6 e/ [* d% x//--- Set the timer...
9 D( O6 |9 y/ d+ n0 L. r: AEventSetTimer(1);
' j- s  r; l5 C8 A) R//--- Set the base of the random number to have equal tests...
& O7 p3 K, @- m+ I* ]. v/ {3 M5 oMathSrand(0xDEAD);' k* y. u9 X- n+ g4 b% N
return(INIT_SUCCEEDED);4 P# k1 d# {9 }. W# a3 c9 ~
}
: w& }$ ~2 F- v; ~! f, l//--- Since we set a timer, we need to destroy it in OnDeInit().
: w8 I6 i/ j! p  v( b' ~void OnDeinit(const int reason)1 J, Y; F3 U7 I) z3 Z) n  `+ i7 ?( }
{; r) M6 ~  }) O  t4 C7 Q; \, C
EventKillTimer();
( q( C$ I# z6 @: a  X2 y( [3 v0 f}, g. J4 U* o4 e) {$ ~+ M2 n
//--- The OnTick function only informs us that we have a new deal
; r! B' j% `6 n6 I/ M. ?void OnTick()- e; q0 ~3 @% O. I- F
{
$ r! F6 w3 j2 `tem_tick = true;
/ u, w* z* Q1 C% d8 O( n}
0 c9 b9 B+ O. ~; X! q9 G# p//+------------------------------------------------------------------+- R; Q" d7 R5 J, F$ Z
//| Expert Advisor main function                                     |/ i% ]% j2 E  m  r
//+------------------------------------------------------------------+
9 v" Q- `  D( n0 r- u$ Z; K2 u2 j! ~9 Tvoid OnTimer()& G8 n/ K9 J7 I7 J$ t1 ?3 C
{
, ~6 u5 P. ~7 B' n7 RMqlRates cotacao[];( _1 j7 Z& F0 r1 q
return ;
6 t( o0 L5 R. V* E- k  w: gif (negocios_autorizados == false) // are we outside the trading window?
* X6 h) `; s3 D* i* vreturn ;6 h; R9 @$ z) p1 e
//--- We are in the trading window, try to open a new position!# m0 I& r6 H0 r# c( ?
int sorteio = MathRand();
6 W# K9 n7 ?0 o4 ^//--- Entry rule 1.1
% H9 n5 z  E# L# K1 b/ oif(sorteio == 0 || sorteio == 32767)
; h2 |9 N# A/ Rreturn ;$ p  e" ?7 W) W3 y7 G
if(MathMod(sorteio, 2) == 0)  // Draw rule 1.2 -- even number - Buy
7 X0 @9 S, F' F$ z2 H3 L- r{* t- x- S) \) I  J
negocios.Buy(info.LotsMin(), _Symbol);
9 l0 ]* i) r- Z}
  N+ [- q5 T* q. X, ^else // Draw rule 1.3 -- odd number - Sell
6 _& s" Y$ J8 X! O# q1 z* K{
, ?" |; K5 S8 r4 I' hnegocios.Sell(info.LotsMin(), _Symbol);
0 \9 v: H) |. l- J. {* |}
. Y- P8 q8 _  s6 R. Y# V}
5 X. X! W, T7 a1 ]- Q//--- Check if we have a new candlestick...
. R. }5 W5 b, ?$ r8 T, ?8 gbool tem_vela_nova(const MqlRates &rate)
) U: x" B1 E% @" X$ R{( F. P4 O$ G% Z5 \6 R
{
& M3 l0 m- ~  F+ h+ g9 O, W) Aret = true;
$ U: Z8 K- ]: u' zclose_positions = false;0 {5 J& E! v8 b+ S5 n; B4 j. q" I
}4 D: [3 Z0 w6 b+ c7 B& x
else
5 q- m5 o$ `: e8 O+ T5 o; `{! r- k, u. F$ ^- j2 _$ s
if(mdt.hour == 16)
& m+ u% F( L0 x% b6 zclose_positions = (mdt.min >= 30);
. l8 e8 r9 F( U% f' R1 f2 z}9 O7 _2 E0 i# q
}
& T0 g2 G- i8 qreturn ret;5 a7 {5 w% @+ b
}9 z; m4 X9 u! C5 A& A( }
//---$ K! }: C4 j4 N2 J( g7 w) `
bool arruma_stop_em_posicoes(const MqlRates &cotacoes[])
9 M3 s, w0 B! |( ]1 P  K{
4 L' Q( f! U; u! f- o; f/ m7 C5 n) sif(PositionsTotal()) // Is there a position?
) q$ V2 a+ F$ L$ L2 l" w{) T' B' W# _. V* ^$ ]  P
double offset[1] = { 0 };
" v# W5 P: z/ U  a% Xif(CopyBuffer(ind_ema, 0, 1, 1, offset) == 1 // EMA successfully copied?( U; d# ~4 l2 \  y
&& PositionSelect(_Symbol))  // Select the existing position!! w3 {! \4 H7 b
{2 y% G9 R0 }, S! l8 Z* S  h7 a  D
ENUM_POSITION_TYPE tipo = (ENUM_POSITION_TYPE) PositionGetInteger(POSITION_TYPE);
" s; o" I& L$ \' J" D4 w& q7 Tdouble SL = PositionGetDouble(POSITION_SL);  p- ^1 p/ k: H
double TP = info.NormalizePrice(PositionGetDouble(POSITION_TP));
) q6 h% A& j  k* |8 }5 Iif(tipo == POSITION_TYPE_BUY)) N1 J" Z, @, p$ c7 R& h0 L% P4 m& B
{
" I) F' J* P# {: {if (cotacoes[1].high > cotacoes[0].high)
1 V2 c8 D  }5 F+ f0 H* F, A- ~{. R; F9 Y6 Q" d& s- C
double sl = MathMin(cotacoes[0].low, cotacoes[1].low) - offset[0];
0 O! T! b( V/ Z/ xinfo.NormalizePrice(sl);; P: Q3 j+ O' r# n2 Q3 t
if (sl > SL)+ r. S8 W( y1 W7 T# ]
{* X- T4 m  L2 O1 r- R+ e4 n
negocios.PositionModify(_Symbol, sl, TP);
% }9 F+ [8 X& d* r3 T}  T, k" M6 R% G! `1 w, N* s
}
( v- L- V! K) `2 N2 G}
; t2 k0 W3 T& Yelse // tipo == POSITION_TYPE_SELL% ~; F" C2 p8 V9 S% o9 H4 X' i
{
7 {$ d$ {! r' lif (cotacoes[1].low < cotacoes[0].low)
. m, P  [0 |, ^$ n5 `8 s( y{/ M& j# c  J; y' y
return true;& s5 o* ]1 k" G- j" ~
}4 r/ U/ u5 p- G) m% y. E  {
// there was no position
7 J% m( D4 O5 u5 g: hreturn false;
, k- j6 _; R8 W: O( Y- }}
  Z: R  V  a$ }, r; t我们简略研究一下上面的代码。 我们将经均化计算的 ATR 值来判定止损步长,即我们发现当前烛条超过前一根时,将止损价位放置在烛条的边界。 这是在函数 arruma_stop_em_posicoes 中完成的。 当其返回 true 时,已有设置,且我们无需在 OnTimer 的主代码中前进。 我使用该函数取代 OnTick,因为我不需要针对每笔执行的交易运行一遍大函数。 函数应该在所定义周期的每根新烛条建立时执行。 在 OnTick 中,设置 true 值表示前一笔交易。 这是必要的;否则,在休市期间,策略测试器将引入暂停,因为即使没有前一笔的交易,它也会执行该函数。
5 p8 M& `0 ?$ K; n到该处为止,一切都严格按照定义好的计划进行,包括两个指定的窗口。 第一个是开仓交易的窗口,在 11:00 到 4:00 之间。 第二个是管理窗口,它允许算法管理持仓,移动其止损价位,直至 16:30 — 此时它应该把当天的所有交易了结。
http://www.simu001.cn/x287863x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-19 19:26 , Processed in 0.653566 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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