当价格越过该线时设置止损单-源码
EA 在启动时会在图表上建立两条线:绿线(开始)和红线(停止)。
您可以使用鼠标将线移动到任意位置。同时,如果绿线位于红线上方,则我们计划在未来下达买入止损订单,如果绿线位于红线下方,则相应地下达卖出止损订单。
//+------------------------------------------------------------------+
//| 交易面板系统.mq4 |
//| 版权 © 2023-2025, AI编程zblog |
//| http://www.eawalk.com |
//+------------------------------------------------------------------+
#property copyright"Copyright © 2024, AI编程zblog"
#property link "http://www.eawalk.com"
#property version "1.00"
#property strict
#property description "专家顾问启动时会在图表上绘制两条线:绿色(起始线)和红色(止损线)。"
#property description "这些线可以用鼠标任意拖动。如果绿色线高于红色线,后续将计划设置买入止损单;如果绿色线低于红色线,则计划设置卖出止损单。"
//+------------------------------------------------------------------+
extern double 订单手数 = 0.01; // 订单手数
extern int 起始距离 = 25; // 起始线到挂单的距离(单位:点)
extern int 止损距离 = 25; // 止损线到止损的距离(单位:点)
extern int 魔法数字 = 123321; // 魔法数字
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ObjectsDeleteAll(0,"cm");
}
//+------------------------------------------------------------------+
void OnTick()
{
if(ObjectFind("cm start")==-1)
{
drawline("cm start",clrGreen,iHigh(NULL,PERIOD_D1,0));
drawtext("cm start ","起始线",iHigh(NULL,PERIOD_D1,0));
}
if(ObjectFind("cm stop")==-1)
{
drawline("cm stop",clrRed,iLow(NULL,PERIOD_D1,0));
drawtext("cm stop ","止损线",iLow(NULL,PERIOD_D1,0));
}
doublePriceStart = ObjectGet("cm start",OBJPROP_PRICE1);
ObjectSetDouble(0,"cm start ",OBJPROP_PRICE,PriceStart);
doublePriceStop = ObjectGet("cm stop",OBJPROP_PRICE1);
ObjectSetDouble(0,"cm stop ",OBJPROP_PRICE,PriceStop);
//---
int tip,Ticket=0;
for (int i=0;i<OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && 魔法数字==OrderMagicNumber())
{
tip = OrderType();
Ticket=OrderTicket();
if (tip>1) break;
Print("-----> 开仓成功并结束运行");
SendNotification(WindowExpertName()+" 开仓成功并结束运行");
ExpertRemove();
break;
}
}
}
if(PriceStart>PriceStop)
{
if(Ticket==0)
{
if (Bid>=PriceStart)
if (OrderSend(Symbol(),OP_BUYSTOP,订单手数,NormalizeDouble(PriceStart+起始距离*Point,Digits),0,NormalizeDouble(PriceStop-止损距离*Point,Digits),0,NULL,魔法数字,0,CLR_NONE)==-1)
Print("错误",GetLastError());
}
else
{
if (Bid<=PriceStop)
{
if (OrderDelete(Ticket))
{
Print("-----> 删除挂单并结束运行");
SendNotification(WindowExpertName()+" 删除挂单并结束运行");
ExpertRemove();
}
}
}
}
else
{
if(Ticket==0)
{
if (Bid<=PriceStart)
if (OrderSend(Symbol(),OP_SELLSTOP,订单手数,NormalizeDouble(PriceStart-起始距离*Point,Digits),0,NormalizeDouble(PriceStop+止损距离*Point,Digits),0,NULL,魔法数字,0,CLR_NONE)==-1)
Print("错误",GetLastError());
}
else
{
if (Bid>=PriceStop)
{
if (OrderDelete(Ticket))
{
Print("-----> 删除挂单并结束运行");
SendNotification(WindowExpertName()+" 删除挂单并结束运行");
ExpertRemove();
}
}
}
}
}
//+------------------------------------------------------------------+
void drawline(string NameL, colorcol, double Y1)
{
ObjectCreate(NameL,OBJ_HLINE, 0,0,Y1,0,0);
ObjectSet (NameL, OBJPROP_COLOR, col);
ObjectSet (NameL, OBJPROP_STYLE, STYLE_SOLID);
ObjectSet (NameL, OBJPROP_WIDTH, 1);
ObjectSet (NameL, OBJPROP_BACK, false);
ObjectSet (NameL, OBJPROP_SELECTED,true);
ObjectSet (NameL, OBJPROP_SELECTED,true);
}
//+------------------------------------------------------------------+
void drawtext(string Name, stringtxt, double Y1)
{
ObjectDelete (Name);
ObjectCreate (Name,OBJ_TEXT,0,Time[WindowFirstVisibleBar()-WindowFirstVisibleBar()/4],Y1,0,0,0,0);
ObjectSetText(Name,txt ,8,"Arial");
ObjectSet (Name, OBJPROP_COLOR, ObjectGet(Name,OBJPROP_COLOR));
}
//+------------------------------------------------------------------+