私募

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

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

[复制链接]
发表于 2024-3-31 08:42:56 | 显示全部楼层 |阅读模式
启动交易模型,并构建 EA
% G/ t1 m0 _& ~3 H  e4 |' G& a在解决系统品质因数之前,有必要创建一个能在测试中使用的基本系统。 我们选择了一个简单的系统:我们先选择一个随机数字,若它是偶数,我们就开仓做多;否则,我们开仓做空,因为数字是奇数。
2 z7 L8 Z; T% H, Q' {- k为了保持随机抽取,我们调用 MathRand() 函数,它提供一个介于 0(零)至 32767 之间的数字。 此外,为了令系统更加平衡,我们将添加两条互补规则。 有了这三条规则,我们将努力确保系统更加可靠。
" g& V# Z& c. {% W& H- `/ K+ }以下是制定这些规则的代码。
0 D+ [# _% ^5 q% a$ B6 k& F; y- f//--- Indicator ATR(1) with EMA(8) used for the stop level...  }% d4 t2 v6 p( p  }; h
int ind_atr = iATR(_Symbol, PERIOD_CURRENT, 1);# V" K2 s* J& O% K2 F+ ]1 s) {. Q
int ind_ema = iMA(_Symbol, PERIOD_CURRENT, 8, 0, MODE_EMA, ind_atr);  _) Y! V- t& Y" H# `/ [  {
//--- Define a variable that indicates that we have a deal...
( G' z# M! i) `1 s7 j' P5 [bool tem_tick = false;0 k( B8 P/ |/ }/ y" A, O
//--- An auxiliary variable for opening a position
5 H  E% O: M. S5 h+ {#include<Trade/Trade.mqh>
6 [5 t. X, X+ g/ P#include<Trade/SymbolInfo.mqh>
9 U9 u- B- y2 x2 S$ x. d' _  GCTrade negocios;
( j. u9 J  E2 X* j+ v6 hCSymbolInfo info;6 I6 U6 A  d" e7 |. t) v; S
//--- Define in OnInit() the use of the timer every second
6 V8 M, k4 G3 p7 o) ]' [//--- and start CTrade
3 ]$ _9 ~& T' Aint OnInit()' [6 N- u, O3 C, h$ Q
{
7 C+ C3 p* f! H1 _) a. W//--- Set the fill type to keep a pending order5 @' I1 E' A+ I" B# V3 _
//--- until it is fully filled
% B. ]+ X; X2 [  q. ]" O: Y+ Enegocios.SetTypeFilling(ORDER_FILLING_RETURN);: a& D7 j8 ]2 b* ~+ J
//--- Leave the fixed deviation at it is not used on B3 exchange
* A) u2 A# h/ m! `' c( ~( {negocios.SetDeviationInPoints(5);
* V- j4 C9 M( o- J+ m; q5 P" @* [//--- Define the symbol in CSymbolInfo...
! u4 ]2 i' `, A% pinfo.Name(_Symbol);
' p4 Q# S$ b, @//--- Set the timer...& K6 e: I7 I4 P
EventSetTimer(1);% r; d1 a- A, a5 ~: `
//--- Set the base of the random number to have equal tests...9 ~; L7 u! f5 K
MathSrand(0xDEAD);
6 K0 q; q( L) V* i5 xreturn(INIT_SUCCEEDED);
3 [- V( c+ Q+ h! |}
7 c8 j: c$ [0 K+ {1 t0 e4 e: N//--- Since we set a timer, we need to destroy it in OnDeInit().
' u$ U& S5 p0 _# s0 m6 ~7 Bvoid OnDeinit(const int reason)3 L6 w, P7 G+ O$ _6 N# }3 g
{% s! R" u1 Z9 q: F% m. `3 R1 ]1 O
EventKillTimer();7 ?2 w/ P4 ^5 Y% x: D- h# y$ D3 c& N
}
4 k3 B/ I! ~/ e4 i# G//--- The OnTick function only informs us that we have a new deal# x- G( F& D! ]3 D/ D  d( j
void OnTick()9 W/ U( `) R/ o& _0 t4 K+ d
{% o' A/ }8 @' A/ i
tem_tick = true;
, E* z$ O, Z; D: _( m}8 E) ~+ [) r8 w1 b. g
//+------------------------------------------------------------------+# H4 G1 v0 B) s1 |; p
//| Expert Advisor main function                                     |
; y5 T2 \, U- W% Y: w//+------------------------------------------------------------------+/ U' N3 X' R& I3 m) J( |0 @  p
void OnTimer()
4 k! _7 n  j* V) i{
3 r+ B: `; u- L" I9 D5 [% `MqlRates cotacao[];
) O# k) t) H9 @3 e$ preturn ;: T1 N. B1 ?5 q, a
if (negocios_autorizados == false) // are we outside the trading window?5 D- y6 O# Y# c8 w5 ]) [
return ;$ N- N7 ?$ X* u/ c
//--- We are in the trading window, try to open a new position!  ^& y- q7 q$ s5 C
int sorteio = MathRand();7 J+ d# i5 B6 z1 a1 \
//--- Entry rule 1.1: K0 P$ ?3 T( M$ @
if(sorteio == 0 || sorteio == 32767)
2 ?6 G# H. v6 S  f% ?- Ireturn ;1 Y2 F8 t! g$ b7 K
if(MathMod(sorteio, 2) == 0)  // Draw rule 1.2 -- even number - Buy! e' i3 E6 K6 b) w( N
{' u( p; M. c4 x" z9 m& [
negocios.Buy(info.LotsMin(), _Symbol);
( C6 V3 s+ a) o8 w% u}
. a/ T+ v7 {5 m( celse // Draw rule 1.3 -- odd number - Sell
$ [4 o6 b/ }1 e- P{1 o- L  ^9 E, e" B6 Y+ W
negocios.Sell(info.LotsMin(), _Symbol);! c7 q7 O. A5 s  B! n) U' L2 P
}# N* s4 d6 H; a6 A* ]# M8 C
}. }0 M/ p7 A; ]
//--- Check if we have a new candlestick...( M" N) P! T% J# @2 N5 D
bool tem_vela_nova(const MqlRates &rate)
( L$ ^) z7 r! H# x$ I7 M8 v{
' l: N; y) h, w{
. x7 q2 w0 _' n$ n9 zret = true;' O  }  K- O" \- x' f
close_positions = false;
( U$ c# r+ r1 ?, f# f}7 O* P6 P2 W. R
else$ @% X, ?) _. Z- ~" }
{
& x& y/ @8 z5 T" T+ D/ p6 sif(mdt.hour == 16)7 l7 i+ {' k# W) z8 s
close_positions = (mdt.min >= 30);5 A3 B4 P$ E# D5 J4 H
}
/ g" h' m0 Z" ?5 _7 }4 x9 v0 l# u}
9 U' C/ S5 z) R9 K- Z; Freturn ret;
6 H5 Z2 R- X% [* H: \! }" \}; _7 {3 P2 ^) V, ]6 G
//---
, E, L; Q3 G! O9 V$ t+ w% Kbool arruma_stop_em_posicoes(const MqlRates &cotacoes[])  x$ h4 A& m7 G% c+ k
{1 X9 H* y& I; G  F$ H
if(PositionsTotal()) // Is there a position?5 D  C- x' S5 B& K0 z
{
' x! a; ]6 T( P3 idouble offset[1] = { 0 };
) _$ @* O) e7 [' G3 ^5 D5 b* dif(CopyBuffer(ind_ema, 0, 1, 1, offset) == 1 // EMA successfully copied?
5 l# [, ~% N' ~: L&& PositionSelect(_Symbol))  // Select the existing position!
; y. G$ g! Z+ E$ K3 Z0 {! ~: ?! T{/ [8 X5 Y1 `6 {; [) Z( @
ENUM_POSITION_TYPE tipo = (ENUM_POSITION_TYPE) PositionGetInteger(POSITION_TYPE);
) h+ G, `0 Y/ I! X8 D& P6 `% H* vdouble SL = PositionGetDouble(POSITION_SL);
+ D. a, J& [$ ^4 h* R( Rdouble TP = info.NormalizePrice(PositionGetDouble(POSITION_TP));
* v0 ~& x" s0 D) i; G9 r8 Qif(tipo == POSITION_TYPE_BUY)3 _  ]# \4 P6 }5 l! Y* @
{9 Q; {$ _5 z" c  H: C
if (cotacoes[1].high > cotacoes[0].high)! o/ y8 G6 i% Q9 A  {* Q9 L
{
8 T; i7 h' N) b9 r1 c. g7 z4 ndouble sl = MathMin(cotacoes[0].low, cotacoes[1].low) - offset[0];
7 b( l6 F6 V, L2 L. L4 l: ?3 n* ~info.NormalizePrice(sl);4 S* `9 i, C% @9 V" ]! M
if (sl > SL)
# K" s. U5 R2 T5 v* q{5 }5 y# A/ v1 R6 e( C
negocios.PositionModify(_Symbol, sl, TP);$ Q9 O- Y; i* ?9 G2 r8 g! k' G
}
% L, _: J$ }- x  t$ q, ?}
5 j9 g& M7 O8 U7 d}; B: O; K* v& T2 c
else // tipo == POSITION_TYPE_SELL
/ }& I# w8 l) v{! g! U# j9 ]/ G7 ~: j  d+ n. I
if (cotacoes[1].low < cotacoes[0].low)& ^7 P8 d% B% S7 j1 ]. o( ^, D1 f' `
{7 O7 t* j4 v% Y7 f+ h0 i1 B
return true;- M9 z- F' l) v
}, p" o, s( P! F0 y8 ~
// there was no position8 \( o# P  `$ @4 J
return false;  S, I6 X- O5 w. z2 [4 w
}
/ R- d! C3 m5 U- t我们简略研究一下上面的代码。 我们将经均化计算的 ATR 值来判定止损步长,即我们发现当前烛条超过前一根时,将止损价位放置在烛条的边界。 这是在函数 arruma_stop_em_posicoes 中完成的。 当其返回 true 时,已有设置,且我们无需在 OnTimer 的主代码中前进。 我使用该函数取代 OnTick,因为我不需要针对每笔执行的交易运行一遍大函数。 函数应该在所定义周期的每根新烛条建立时执行。 在 OnTick 中,设置 true 值表示前一笔交易。 这是必要的;否则,在休市期间,策略测试器将引入暂停,因为即使没有前一笔的交易,它也会执行该函数。" Z2 Y& P% N/ i/ u6 {
到该处为止,一切都严格按照定义好的计划进行,包括两个指定的窗口。 第一个是开仓交易的窗口,在 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-30 21:53 , Processed in 0.841577 second(s), 32 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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