私募网

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

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

[复制链接]
发表于 2024-3-31 08:42:56 | 显示全部楼层 |阅读模式
启动交易模型,并构建 EA
8 h3 v- ?7 ^" M1 a/ b# K在解决系统品质因数之前,有必要创建一个能在测试中使用的基本系统。 我们选择了一个简单的系统:我们先选择一个随机数字,若它是偶数,我们就开仓做多;否则,我们开仓做空,因为数字是奇数。, u) w' z% b4 v3 I9 z5 f  p
为了保持随机抽取,我们调用 MathRand() 函数,它提供一个介于 0(零)至 32767 之间的数字。 此外,为了令系统更加平衡,我们将添加两条互补规则。 有了这三条规则,我们将努力确保系统更加可靠。  W) \/ B$ Y# s+ C
以下是制定这些规则的代码。
( ]8 {2 D+ v- V' v/ P$ ]! W$ `2 q# D8 R//--- Indicator ATR(1) with EMA(8) used for the stop level...! R/ S2 G1 e) n! L/ w- s6 X, C
int ind_atr = iATR(_Symbol, PERIOD_CURRENT, 1);9 [1 ?- K1 F/ \/ i' M# p3 P
int ind_ema = iMA(_Symbol, PERIOD_CURRENT, 8, 0, MODE_EMA, ind_atr);
# |+ _! j) J" ^) a//--- Define a variable that indicates that we have a deal...
7 Q6 D* G( g5 z- E  M$ n. Abool tem_tick = false;# F9 P# s8 s2 A
//--- An auxiliary variable for opening a position# q- v( E; `5 z! E
#include<Trade/Trade.mqh>/ |% H- Z" @" K$ n
#include<Trade/SymbolInfo.mqh>
. e, L( s9 [% \. a& \3 k. k( vCTrade negocios;
( P, {  D# O9 ACSymbolInfo info;
# o& v8 k1 [) y: W( B' e4 L//--- Define in OnInit() the use of the timer every second+ }; W1 n: B8 p
//--- and start CTrade
" w0 l% b' Y( v* A3 G8 Rint OnInit()4 c0 O7 D6 a; L# F
{
( e/ S! ]0 q2 Q$ \4 L' {) \5 m//--- Set the fill type to keep a pending order; v; i; Z& U$ A; x) I; |% r9 C& F
//--- until it is fully filled
7 p+ H9 |& |3 X" {negocios.SetTypeFilling(ORDER_FILLING_RETURN);
2 @# T, Z2 L1 o& \' q) H//--- Leave the fixed deviation at it is not used on B3 exchange; j; W" l- I" m/ A/ h* |; [1 e) ?
negocios.SetDeviationInPoints(5);' K- L5 d3 ?" F5 u9 B6 g
//--- Define the symbol in CSymbolInfo...
$ c7 U# a, J$ j0 Kinfo.Name(_Symbol);
' |% T% w1 A# U, r0 q//--- Set the timer...
* L1 C; z0 b# h, zEventSetTimer(1);
* K& W) g* [- J3 L/ h9 E9 I5 {//--- Set the base of the random number to have equal tests...9 w8 j! e6 F8 V
MathSrand(0xDEAD);
. O2 K% f2 p( I9 ~2 D( g, Sreturn(INIT_SUCCEEDED);6 w9 X8 E: |$ i; \+ \9 V8 c* |
}5 Z5 v& K5 @5 _1 `% a& @) U
//--- Since we set a timer, we need to destroy it in OnDeInit().# J7 j) ]5 R4 t
void OnDeinit(const int reason)3 }0 G3 J& Z3 Z
{/ W% W  ]5 L, ^0 P3 B! G  c6 p/ L
EventKillTimer();
: |$ {$ N7 ?& j$ E" K# ?$ w. _}
" j* L# I) @5 @//--- The OnTick function only informs us that we have a new deal
$ Z" i, D% i9 x9 T; @+ Ivoid OnTick()' ^# U1 Z( H7 G3 ^: x
{# o* L1 U, F' `  F# {9 E- o+ m
tem_tick = true;
9 p# _, i! p$ Y9 ~% X}
' Z  O/ X8 w4 J% [! @//+------------------------------------------------------------------+4 }. h& w6 P) Q( m, C
//| Expert Advisor main function                                     |' T! D) |) P7 u2 u/ b! v
//+------------------------------------------------------------------+
9 o& p* E, w  l3 ^" Y+ a2 K2 ~' O; tvoid OnTimer()
# E" E6 r3 [! j2 `2 @* @5 K% n{* G8 V$ o% B. ?9 m) R% R2 `
MqlRates cotacao[];
9 _6 e( T4 M4 L/ F( Y/ L0 Ereturn ;( l' i$ E) m& W6 O" i" v
if (negocios_autorizados == false) // are we outside the trading window?9 z( U+ A4 Z+ O$ r* y. _
return ;  y3 H0 y- W! A  B  I/ m" F& D5 h) O4 G
//--- We are in the trading window, try to open a new position!( Q6 G" F/ X+ b
int sorteio = MathRand();. o% ^% f( g& b
//--- Entry rule 1.1
: U" N. c. g) }8 Mif(sorteio == 0 || sorteio == 32767)
! t$ s9 m0 k3 p- Areturn ;
! I- Y% p; V2 Y, W/ A1 m* X! u" Gif(MathMod(sorteio, 2) == 0)  // Draw rule 1.2 -- even number - Buy
9 W" w: |! h6 O$ E  M9 |{$ t/ l% m8 S! o( n% n$ p
negocios.Buy(info.LotsMin(), _Symbol);
2 b2 l8 [6 y' _  v* q0 H}/ ?+ K7 Z! y- E  D
else // Draw rule 1.3 -- odd number - Sell; y9 m0 H% _) {$ D  k$ m& I2 L8 T
{: z: U  r0 }, c6 n( Q
negocios.Sell(info.LotsMin(), _Symbol);% L, j* ?; a/ S) `  q
}
9 ?- d' U; N4 k! U- n7 v) k* h}4 V: m. ]. a  j3 m7 ]4 ]. q- J
//--- Check if we have a new candlestick...
; G# l8 M) M9 R& t9 Y) w3 \. ?bool tem_vela_nova(const MqlRates &rate)# `( l% j8 Q3 Y
{- I9 A1 m6 z% J
{
4 p4 `5 v' k* c, z  G* G, i( y6 k+ sret = true;7 ~# C2 {2 j: |# f( p0 p$ T& B) l
close_positions = false;
6 s2 g: L8 f8 @. p5 x  E" z, K}
# m7 _, [! H8 W% B! h: velse! c7 t" H* p& l- A4 k; N
{2 D9 X9 Q8 k/ K. X+ f
if(mdt.hour == 16)2 G6 F" C) E& a& o! w3 e
close_positions = (mdt.min >= 30);
  F# G3 Z: }+ j2 K: X8 ~! j7 J0 ]. t}
; W- m' Y4 Q& @9 P5 o% F" a5 M}6 D0 j( g% y  P. j- z! M
return ret;# r. M6 o4 {1 _( I
}
; Y6 W" J7 e% [5 g//---
6 a1 v2 p- F: Nbool arruma_stop_em_posicoes(const MqlRates &cotacoes[])" q+ {/ G' g6 T9 U3 X7 @  N
{9 \8 e& w5 q/ u
if(PositionsTotal()) // Is there a position?! w" I; E$ r8 a5 K$ _: {; f, p
{/ L' |2 U2 j: d5 R7 R9 }" e1 [6 ~
double offset[1] = { 0 };
* x2 K; m+ i6 }- \" T: W. O( Q/ ]if(CopyBuffer(ind_ema, 0, 1, 1, offset) == 1 // EMA successfully copied?
4 `4 W& F. U  |0 w4 A&& PositionSelect(_Symbol))  // Select the existing position!: T- i* N, [  N8 j# r/ f0 E
{
( y, G5 }) u" V$ s/ ~! A* b6 ?ENUM_POSITION_TYPE tipo = (ENUM_POSITION_TYPE) PositionGetInteger(POSITION_TYPE);2 M9 F$ |9 K  F( N+ E. l0 |
double SL = PositionGetDouble(POSITION_SL);
6 T: ?6 y8 g$ }6 N- Ndouble TP = info.NormalizePrice(PositionGetDouble(POSITION_TP));
3 V* o: U, R; J3 yif(tipo == POSITION_TYPE_BUY)
7 V& M, G5 ]6 C, a4 ?2 ~2 A0 \3 M{9 R: ~( Z( H0 e
if (cotacoes[1].high > cotacoes[0].high). F1 n( ^) E' y7 D9 q7 T
{9 b0 W2 N' _7 H2 }4 g. }
double sl = MathMin(cotacoes[0].low, cotacoes[1].low) - offset[0];
3 J  }$ \! z: h$ H+ K: d# L9 a# Ninfo.NormalizePrice(sl);
3 h$ t! h+ T7 Mif (sl > SL)5 R) R6 F9 R! X. z: e
{
7 J+ P: i& _! ~  R) [# B# p5 Qnegocios.PositionModify(_Symbol, sl, TP);( [4 r, [; E) C( F
}7 c9 G+ I: W' R5 t: B& c- R" H8 ~) S
}6 I( p$ m9 d: M9 ^
}# t! C0 m, ?8 V1 q+ @/ r2 a
else // tipo == POSITION_TYPE_SELL  m: e( d& r$ `
{
" X' |' f) r, L$ {% b7 Lif (cotacoes[1].low < cotacoes[0].low)* w3 Q; f' K% U+ Q
{/ `2 g5 E. R* r' b1 G
return true;* x. x5 z" W: _2 P( |$ ^
}7 b0 C& A% b. d" Z# |% G/ F' R
// there was no position4 V7 H3 r1 t1 C4 X" w* K3 `
return false;* ~, c, t3 M# l2 `" D
}
6 P4 h" C) z( t: [' v/ j% W我们简略研究一下上面的代码。 我们将经均化计算的 ATR 值来判定止损步长,即我们发现当前烛条超过前一根时,将止损价位放置在烛条的边界。 这是在函数 arruma_stop_em_posicoes 中完成的。 当其返回 true 时,已有设置,且我们无需在 OnTimer 的主代码中前进。 我使用该函数取代 OnTick,因为我不需要针对每笔执行的交易运行一遍大函数。 函数应该在所定义周期的每根新烛条建立时执行。 在 OnTick 中,设置 true 值表示前一笔交易。 这是必要的;否则,在休市期间,策略测试器将引入暂停,因为即使没有前一笔的交易,它也会执行该函数。
) _, X0 M4 k! E8 G到该处为止,一切都严格按照定义好的计划进行,包括两个指定的窗口。 第一个是开仓交易的窗口,在 11:00 到 4:00 之间。 第二个是管理窗口,它允许算法管理持仓,移动其止损价位,直至 16:30 — 此时它应该把当天的所有交易了结。
http://www.simu001.cn/x287863x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-19 03:28 , Processed in 0.740126 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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