文章来源:123财经导航 | william
在学习了一系列基本的知识后,今天带大家进入策略编写的实战部分,策略编写包含三大核心:信号检查、建仓管理、持仓管理(风险控制),通俗一点讲就是:必须从清楚进场到出场出场的一个完整流程。
准备工作:
先写好后续要使用到的外部参数。
input int fast =20,
slow =50,
magic =2024;
input double lot = 0.01;
input string cmt = "死亡均线";
信号定义:
本次策略讲解我们以MA移动均线为例进行讲解,先来熟悉一下这个指标的基本参数;
首先检查是否有新的 K 线生成,定义的一个 NewBar() 函数来实现。只有在有新 K 线时,才会继续执行后续的策略逻辑,以避免无节制的开仓。
信号判断:
这里使用了 iMA() 函数来计算移动平均线,并指定了不同的时间位移(2 和 1)来获取当前和上一个 K 线的数值。根据两组移动平均线的关系,判断是否出现交叉信号:
完整代码:
#property copyright "BBTrading"
#property link "https://www.00123.com"
#property strict
input int fast =20,
slow =50,
magic =2024;
input double lot = 0.01;
input string cmt = "死亡均线";
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnTick()
{
if(NewBar()){
double fast1 =iMA(Symbol(),PERIOD_CURRENT,slow,0,MODE_SMMA,PRICE_CLOSE,2);
double fast2 =iMA(Symbol(),PERIOD_CURRENT,fast,0,MODE_SMMA,PRICE_CLOSE,2);
double slow1 =iMA(Symbol(),PERIOD_CURRENT,slow,0,MODE_SMMA,PRICE_CLOSE,1);
double slow2 =iMA(Symbol(),PERIOD_CURRENT,fast,0,MODE_SMMA,PRICE_CLOSE,1);
if(fast1>fast2 && slow1<slow2){
CloseOrder(OP_SELL);
int res=OrderSend(_Symbol,OP_BUY,lot,Ask,20,0,0,cmt,magic);
}
if(fast1<fast2 && slow1>slow2){
CloseOrder(OP_BUY);
int res=OrderSend(_Symbol,OP_SELL,lot,Bid,20,0,0,cmt,magic);
}
}
}
void CloseOrder(int type)
{
for(int j = OrdersTotal() - 1; j >= 0; j--) {
if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES)){
if(OrderSymbol() == _Symbol && OrderMagicNumber()==magic && OrderType() == type){
bool close =OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10);
}
}
}
}
bool NewBar()
{
static datetime last;
if(last!= Time[0]){
last = Time[0];
return true;
}
return false;