私募

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

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

[复制链接]
发表于 2024-3-31 08:42:56 | 显示全部楼层 |阅读模式
启动交易模型,并构建 EA
# m- R( n; D, b0 {$ @( e在解决系统品质因数之前,有必要创建一个能在测试中使用的基本系统。 我们选择了一个简单的系统:我们先选择一个随机数字,若它是偶数,我们就开仓做多;否则,我们开仓做空,因为数字是奇数。
0 R3 {, a# m  P8 u# t) u" e- {为了保持随机抽取,我们调用 MathRand() 函数,它提供一个介于 0(零)至 32767 之间的数字。 此外,为了令系统更加平衡,我们将添加两条互补规则。 有了这三条规则,我们将努力确保系统更加可靠。. D5 ?2 ]  U8 G
以下是制定这些规则的代码。
! A. z  [& p. m9 o- J4 M//--- Indicator ATR(1) with EMA(8) used for the stop level...* N* {) W1 Q, F9 P* a  n1 W) i& o+ ^
int ind_atr = iATR(_Symbol, PERIOD_CURRENT, 1);8 N. k/ L; H6 M: {# V0 G- e! f. K
int ind_ema = iMA(_Symbol, PERIOD_CURRENT, 8, 0, MODE_EMA, ind_atr);0 Y7 b* x! ~( W
//--- Define a variable that indicates that we have a deal...% G* D% ~7 n. `! D
bool tem_tick = false;+ b8 {  ]$ W7 X, ^: D- V$ v! z
//--- An auxiliary variable for opening a position
4 d3 R1 ]& l$ Y1 ^( r* P#include<Trade/Trade.mqh>: ]8 w0 n% Z5 A, ^1 C. x1 b
#include<Trade/SymbolInfo.mqh>
1 J: ]6 U  I  ~2 C; i+ i4 QCTrade negocios;" F+ K5 Y# Y" C6 Q
CSymbolInfo info;
' v- ^' F" k/ P; n% Y5 Z) `7 j//--- Define in OnInit() the use of the timer every second
/ O; i6 i! D: A' e; o//--- and start CTrade
$ F$ N# l! C- Y6 j+ j1 I8 jint OnInit()
: W3 [# b) N; M% p* l{8 @: X9 k/ N" v/ a8 v5 P
//--- Set the fill type to keep a pending order
- j+ C" B- T) M; ~# ?//--- until it is fully filled
9 j! B; w% y& ^; B2 [" enegocios.SetTypeFilling(ORDER_FILLING_RETURN);
$ T+ `. S% @( b+ f7 r9 ]//--- Leave the fixed deviation at it is not used on B3 exchange
) H6 C2 t( A4 \# n4 s# x+ inegocios.SetDeviationInPoints(5);
* O5 ~( S; ^1 f2 l) T//--- Define the symbol in CSymbolInfo...
. k" w6 l% _& t# J4 }info.Name(_Symbol);
- w+ `" d& V4 x//--- Set the timer...
, ~5 v7 w, m! d& x+ U/ xEventSetTimer(1);* @% B! J; Y7 o  ], i7 Y6 f
//--- Set the base of the random number to have equal tests...
: d; n( f. C' q0 @, Q, ~MathSrand(0xDEAD);6 E; a" d  g/ _/ A
return(INIT_SUCCEEDED);
: l. h" j1 z( q7 g+ C. ?; x}2 [: T/ G5 r# {6 s2 F
//--- Since we set a timer, we need to destroy it in OnDeInit().$ ]. T! ~% L1 ~) S5 A- n: u" E
void OnDeinit(const int reason)
7 |# K# g* d% A2 \; W7 y1 r{0 N, H* W& p9 t* {2 ]
EventKillTimer();
; x, X) Y. \& P}
+ V: u2 T: v- k7 e% [1 w. L( a//--- The OnTick function only informs us that we have a new deal
/ y, J9 E1 W# s: J: avoid OnTick()$ f4 c/ J( }, l4 z! i
{
6 y  o  S7 S' \4 R8 ^tem_tick = true;
, u' L6 r* ]! b: ~2 z' ?}
1 u2 l9 {8 `5 R//+------------------------------------------------------------------+
  Z/ {) e& v4 L4 Q) W+ M; O//| Expert Advisor main function                                     |; c3 z2 _* t' ^6 M- e8 h$ M0 p
//+------------------------------------------------------------------+* a2 W4 G: ]5 K- e
void OnTimer()& y) e& q1 D; E& X9 [+ u: S, t' V
{
5 I: U- t' y7 k- }/ D" ~MqlRates cotacao[];
4 x! j1 s5 m' s. N% ]return ;2 m( B' r  r: r0 ^- y* H& }7 f
if (negocios_autorizados == false) // are we outside the trading window?; ^( v2 K8 G6 c( g2 }8 m. j
return ;+ ^1 O* n/ L0 }. F
//--- We are in the trading window, try to open a new position!
) E+ H4 X  T+ B% q  gint sorteio = MathRand();
+ O7 R8 X8 y* p$ l! x$ A. e//--- Entry rule 1.1
8 f8 [' d7 m# nif(sorteio == 0 || sorteio == 32767)! m# ~9 ]" x) }. s* _. e
return ;
# e8 x$ F6 S/ z8 [6 |/ X8 [if(MathMod(sorteio, 2) == 0)  // Draw rule 1.2 -- even number - Buy) a% w/ X8 f0 }: Y8 O1 w, k; `
{
# A( t: q0 l0 [8 ~+ U& qnegocios.Buy(info.LotsMin(), _Symbol);
  I) ^1 @) D( c}
( r  X" b# l+ l# ]else // Draw rule 1.3 -- odd number - Sell
" `4 a6 u  L6 _+ d: Q4 Q{
9 r4 I" A; s+ M: Qnegocios.Sell(info.LotsMin(), _Symbol);
8 l% A4 m3 j" |! F0 y( q' b}
8 Q% Y2 k- c) p% z8 _+ I. p}( i( c8 Y& \; X6 D4 G$ L
//--- Check if we have a new candlestick...
' |) E- L8 G! q+ h. A! s2 jbool tem_vela_nova(const MqlRates &rate)
8 O4 Y/ }, _3 ?& Z{
. |2 R* F& z& F" z5 W/ A5 Z: G{
- N: s" S3 X2 m" b8 D0 Yret = true;7 L8 n. S* M! E- D0 d+ }( M# o) z6 F0 k
close_positions = false;; x4 s1 l$ m5 J3 |
}
! t1 p+ ?) R5 Relse, p1 Z1 k' Q9 b3 U" ~
{
6 t- j$ |4 z! z& x+ V0 y$ P; Pif(mdt.hour == 16)
* O, ^" i6 d( t. k$ Q* z& b  sclose_positions = (mdt.min >= 30);$ q3 z5 @1 A$ c# M/ i" V
}! r  Y& L0 }3 O* l1 y7 w+ E
}
" l) b  ~) n4 T: l1 d+ f) j8 xreturn ret;
% N! f! f' D. \( v6 p}
4 q; q6 o& q, E//---
* F2 Z, K6 t! U2 z7 s$ J- p# P  ~bool arruma_stop_em_posicoes(const MqlRates &cotacoes[])5 h" C9 \! q: t9 i% N+ D
{- [) A2 C! V6 O, K- Y1 c) \
if(PositionsTotal()) // Is there a position?
7 O, L$ j  M+ _3 u; S0 E{5 B8 ?$ C- B9 t: U* Z
double offset[1] = { 0 };
# l' T" L% a5 ^( k$ c( ^* Jif(CopyBuffer(ind_ema, 0, 1, 1, offset) == 1 // EMA successfully copied?6 ^( l  d$ p" a4 [) q
&& PositionSelect(_Symbol))  // Select the existing position!! d( Q2 X5 b0 Q' @- X) l, ]
{9 T7 v$ f" L) i+ v0 o
ENUM_POSITION_TYPE tipo = (ENUM_POSITION_TYPE) PositionGetInteger(POSITION_TYPE);- N2 d5 O- c7 q
double SL = PositionGetDouble(POSITION_SL);( z  I9 C7 ~$ o, G4 O3 G
double TP = info.NormalizePrice(PositionGetDouble(POSITION_TP));7 }, e/ O, ?8 x1 A# c& ?
if(tipo == POSITION_TYPE_BUY)! s, f' ]$ d6 a9 B0 T' n/ S$ k2 H% h
{
: a- T' f5 ?, d+ j' f/ n) Iif (cotacoes[1].high > cotacoes[0].high)  {  L8 v3 @" ~' l2 a7 V  _6 R
{- W. G6 x: g) b: k2 e) R* y+ O
double sl = MathMin(cotacoes[0].low, cotacoes[1].low) - offset[0];
# K% b# a0 w# \9 ?info.NormalizePrice(sl);: e" m3 F6 V+ q; d
if (sl > SL), K2 ~' A% J5 D9 O" _8 ]# i5 C) R  B
{5 x. d% e2 U6 w7 [# p
negocios.PositionModify(_Symbol, sl, TP);
+ J& p8 N& Y9 c}
# u# _6 s) a8 b! @0 R9 H6 {}
1 R4 ~  H6 a+ k  N6 O}
9 h; n6 w; u3 R# Welse // tipo == POSITION_TYPE_SELL
6 D; m7 u3 u; @3 n2 T8 b{, Y/ z. W1 P: `! K
if (cotacoes[1].low < cotacoes[0].low)
5 ^+ k# `9 D) ?{- H  @2 t" X2 C+ E! ?. f% N% H
return true;
5 e. B# G6 l" p6 I1 a' e}
" n4 w! ]. }; C! j3 J// there was no position) u: [3 n4 ^  q/ \  `
return false;
! l6 i: {. D1 a; y}
0 f; v; O9 y3 O+ x: Z& p我们简略研究一下上面的代码。 我们将经均化计算的 ATR 值来判定止损步长,即我们发现当前烛条超过前一根时,将止损价位放置在烛条的边界。 这是在函数 arruma_stop_em_posicoes 中完成的。 当其返回 true 时,已有设置,且我们无需在 OnTimer 的主代码中前进。 我使用该函数取代 OnTick,因为我不需要针对每笔执行的交易运行一遍大函数。 函数应该在所定义周期的每根新烛条建立时执行。 在 OnTick 中,设置 true 值表示前一笔交易。 这是必要的;否则,在休市期间,策略测试器将引入暂停,因为即使没有前一笔的交易,它也会执行该函数。4 J: j/ i) o4 o$ Q3 d- |
到该处为止,一切都严格按照定义好的计划进行,包括两个指定的窗口。 第一个是开仓交易的窗口,在 11:00 到 4:00 之间。 第二个是管理窗口,它允许算法管理持仓,移动其止损价位,直至 16:30 — 此时它应该把当天的所有交易了结。
http://www.simu001.cn/x287863x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 07:34 , Processed in 0.688080 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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