新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 475

 

@Artyom Trishkin@Konstantin Nikitin

告诉我, 通过int start 轮询void NOTIFICATION() 函数是否正确 ?那里有一个持续的循环!也许把这个逻辑直接放到启动中会更正确?所以不要让函数过载!而我最初写的时候,是为了让自己读起来更顺口!

 
Rewerpool:

@Artyom Trishkin@Konstantin Nikitin

告诉我, 通过int start 轮询void NOTIFICATION() 函数是否正确 ?那里有一个持续的循环!也许把这个逻辑一次性投入到启动中去会更符合逻辑?

使用OnTick()。这一切都取决于所需的逻辑。
 
请告诉我在哪里插入这个?//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- минимально допустимый объем для торговых операций
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- максимально допустимый объем для торговых операций
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- получим минимальную градацию объема
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("Объем не является кратным минимальной градации SYMBOL_VOLUME_STEP=%.2f, ближайший корректный объем %.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="Корректное значение объема";
   return(true);
  }
 

专家顾问代码本身


enum t
{
e=1,//通过抛物线指标
};
enum tf
{
af=0, // 当前
bf=1, // 1分钟
cf=2, // 5分钟
df=3, // 15分钟
ef=4, // 30分钟
ff=5, // 1小时
gf=6, // 4小时
hf=7, // 1天
};

外置 int Magic = 123654789;
外部inttern Slippage = 0;
inttern double Lots = 1;
外部int int rsi_period = 14;
外来的int rsi_high = 50;
int rsi_price = PRICE_CLOSE;
外来的int rsi_low = 50;
int loss_stop = 5000。
extern int take_profit = 5000;
double sar_step = 0.03;
double sar_max = 0.03;

int GeneralNoLoss = false; // 从盈亏平衡点开始跟踪。
int parameters_trailing = e; // trawl方法
int StartTrall = -5000; //最小拖网利润,单位:分
int StepTrall = 1; //步进式跟踪止损
输入tf TF_Tralling = af; // 指标时间框架(0-当前)。
extern int delta = 50; // 从计算的止损水平缩进。

double Step = 0.03; //抛物线步骤(方法4)。
double Maximum = 0.03; //抛物线最大值(方法4)。


color text_color = Lime; //信息输出的颜色

双马,rsi,sar_1,sar_2,ma_1,ma_2,ma_3,ma_4,ma_5,ma_6。
datetime LastBuyTime, LastSellTime;

int STOPLEVEL。
int TF[10]={0,1,5,15,30,60,240,1440,10080,43200};
双重SLB=0,SLS=0。


int OnInit()

{
//---

//---
return(0);
}

空白的OnTick(){
STOPLEVEL=(int)MarketInfo(Symbol(),MODE_STOPLEVEL)。

int b=0,s=0。
双重OOP,price_b=0,price_s=0,lot=0,NLb=0,NLs=0,LS=0,LB=0。
int tip,Ticket;
bool error。
双SL,OSL。
int n=0。
如果(b==0)SLB=0。
如果(s==0)SLS=0。
for (int i=OrdersTotal(); i>=0; i--)
{
如果(OrderSelect(i, SELECT_BY_POS)==true)。
{
tip = OrderType()。
如果(提示<2 && (OrderSymbol()==Symbol())&& (OrderMagicNumber()==Magic ))
{
OSL = OrderStopLoss()。
OOP = OrderOpenPrice()。
Ticket = OrderTicket()。
n++;
如果(tip==OP_BUY)
{
如果 (GeneralNoLoss)
{
SL = SlLastBar(OP_BUY,Bid,NLb)。
如果(SL < NLb+StartTrall*Point)继续。
}
否则
{
SL = SlLastBar(OP_BUY,Bid,OOP)。
如果(SL < OOP+StartTrall*Point)继续。
}
//如果(OSL >= OOP && only_NoLoss)继续。
如果(SL >= OSL + StepTrall*Point && (Bid-SL)/Point>STOPLEVEL)
{
error=OrderModify(Ticket,OOP,SL,OrderTakeProfit(),0,White);
if (!error) Comment("TrailingStop Error",GetLastError()," order ",Ticket," SL ",SL);
else Comment("TrailingStop",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES))。
}
}
如果(tip==OP_SELL)
{
如果 (GeneralNoLoss)
{
SL = SlLastBar(OP_SELL,Ask,NLs)。
如果(SL>NLs-StartTrall*Point)继续。
}
否则
{
SL = SlLastBar(OP_SELL,Ask,OOP)。
如果(SL>OOP-StartTrall*Point)继续。
}
//如果(OSL <= OOP && only_NoLoss)继续。
如果((SL <= OSL-StepTrall*Point || OSL==0) && (SL-Ask)/Point>STOPLEVEL)
{
error=OrderModify(Ticket,OOP,SL,OrderTakeProfit(),0,White);
if (!error) Comment("TrailingStop Error",GetLastError()," order ",Ticket," SL ",SL);
else Comment("TrailingStop",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES))。
}
}
}
}
}
ma = iMA(Symbol(), 0, 70, 0, MODE_SMA, PRICE_CLOSE, 1);
rsi = iRSI(Symbol(), 0, rsi_period, rsi_price, 1);
sar_1 = iSAR(Symbol(), 0, sar_step, sar_max, 1);
sar_2 = iSAR(Symbol(), 0, sar_step, sar_max, 2);


如果((sar_step))
{
LastBuyTime = Time[0];
如果(OrderSend(Symbol(, OP_BUY, Lots, NormalizeDouble(Ask,Digits), Slippage, Ask - loss_stop*Point, Ask + take_profit*Point, "Order", Magic, 0, clrGreen) > 0){
Print("Buy Order has been sent!");
返回。
}else Print("Buy Order Error")。
}
如果((hhchhchhchh))
{
LastSellTime = Time[0];
如果(OrderSend(Symbol(), OP_SELL, Lots, NormalizeDouble(Bid, Digits), Slippage, Bid + loss_stop*Point, Bid - take_profit*Point, "Order", Magic, 0, clrRed) > 0)
{
Print("Sell Order has been sent!");
返回。
}else Print("卖出订单错误")。
}
}

//--------------------------------------------------------------------
double SlLastBar(int tip,double price,double OOP)
{
double prc=0。
switch(parameters_trailing)
{
案例1://通过抛物线指标
prc = iSAR(Symbol(),TF[TF_Tralling],Step, Maximum,0);
如果(tip==OP_BUY)
{
prc = NormalizeDouble(prc - delta*Point,Digits)。
如果(price-STOPLEVEL*Point < prc) prc=0;
ARROW("cm_SL_Buy", prc, 4, clrAqua)。
}
如果(tip==OP_SELL)
{
prc = NormalizeDouble(prc + delta*Point,Digits)。
如果(价格+STOPLEVEL*Point > prc) prc=0;
ARROW("cm_SL_Sell", prc, 4, clrRed)。
}
突破。
}
return(prc)。
}

//--------------------------------------------------------------------
字符串StrPer(int per)
{
如果(per == 0) per=Period()。
如果(per == 1)返回("M1")。
如果(per == 5)返回("M5")。
如果(per == 15)返回("M15")。
如果(per == 30)返回("M30")。
如果(per == 60)返回("H1")。
如果(per == 240)返回("H4")。
如果(per == 1440)返回("D1")。
if (per == 10080) return("W1")
如果(per == 43200)返回("MN1")。
return("period error")。
}
//+------------------------------------------------------------------+
void ARROW(string Name, double Price, int ARROWCODE, color c)
{
ObjectDelete(Name)。
ObjectCreate(Name,OBJ_ARROW,0,Time[0],Price,0,0,0)。
ObjectSetInteger(0,Name,OBJPROP_ARROWCODE,ARROWCODE)。
ObjectSetInteger(0,Name,OBJPROP_SELECTABLE, false)。
ObjectSetInteger(0,Name,OBJPROP_SELECTED, false)。
ObjectSetInteger(0,Name,OBJPROP_COLOR, c)。
ObjectSetInteger(0,Name,OBJPROP_WIDTH, 1)。
}
//--------------------------------------------------------------------
color Color(bool P,color a,color b)
{
如果(P)返回(a)。
返回(b)。
}
//--------------------------------------------------------------------

 
Vladimir Ozharovskiy:
你能告诉我在哪里插入这个吗?//+------------------------------------------------------------------+

Well....如果如此关键

使之如此。

//+------------------------------------------------------------------+
//|  Проверяет объем ордера на корректность                          |
//+------------------------------------------------------------------+

很好......)))

 
Alekseu Fedotov:

Well....如果如此关键

使之如此。

(漂亮......))。

但是,说真的?)

 
Vladimir Ozharovskiy:

但是说真的?)

如果你指的是函数本身,把它复制并粘贴到程序的最末尾。

必须在无效的OnTick()函数之外。

 
Vladimir Ozharovskiy:

但是,说真的?)

我认为这个功能没有竞标,检查和报告

 
Alekseu Fedotov:

如果你指的是函数本身,把它复制并粘贴到程序的末尾。

确保它是在void OnTick()函数之外。

然后,一个人应该怎么做?你必须正确称呼它!

 
这似乎有帮助...谢谢你!
原因: