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

 
Youri Lazurenko:

我是这样做的--开立一个TP和SL为零的订单,然后用所需的TP和SL参数修改(该订单)。我已经写过了,在其他账户上一切正常,只有在ndd上有这样的事情。以前没有和其他有类似账户的人合作过,无法比较。也许只有forex4u的bleeping,也可能是所有ndd账户。我想知道,以便今后参考。
既然你有130的误差,那就看一下止损单参数。在任何情况下,它们都不应该比服务器设置中的StopLevel值更接近。如果它等于零,则使用双倍展开+1点
 
Youri Lazurenko:

我是这样做的--开立一个TP和SL为零的订单,然后用正确的TP和SL参数修改(该订单)。我已经写过了,在其他账户上一切正常,只有在ndd上有这样的事情。以前没有和其他有类似账户的人合作过,无法比较。也许只有forex4u的bleeping,也可能是所有ndd账户。想知道进一步的信息。

开仓时,使用这些功能来计算正确的止损和取舍。

//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
}
//+------------------------------------------------------------------+
 
Alexey Viktorov:

有什么区别

点数=收费/手数/点值,具体数字为8/2/4=1

点数=收费/(手数*Tickvalue)的具体数字 8/(2*4)=8/8=1

分数也可用于...


不同的是,由于某种原因,我的名字也乘以Point(OrderCommission()/(tv*OrderLots()))*Point()
 
Artyom Trishkin:
如果你有错误130,那就看一下止损单的参数。在任何情况下,它们都不能比服务器设置中的StopLevel值更接近。如果它等于零,则使用双倍差价+1分


非常感谢您在下一篇文章中提供的功能。

问题是,我根本没有设置止损点(平均)。为什么这个错误在我早上启动终端和修改时不存在,而只在会议开始时打开一个订单(日线图)时存在(错误),如果它是一对的。技术支持人员回答说,这种修改在时间和距离上都没有限制(传播范围并不重要)。

我将尝试用所有的建议做一些实验,我将在以后得出我的结论。

再次非常感谢你。

 
Vitalie Postolache:

不同的是,由于某种原因,我的名字也乘以Point:(OrderCommission()/(tv*OrderLots()))*Point()

好吧,我来回答:有一个1.0520的价格,在计算中我们得到了数字(int)Comm,然后我们需要从价格中加上/减去它=1.0520+(int)Comm ?现在,为了不乘以--这是立即进行的。

 
Youri Lazurenko:


非常感谢您在下一篇文章中提供的功能。

问题是,我根本没有设置止损(平均)。为什么这个错误在我早上启动终端和修改时不存在,而只在会议开始时打开一个订单(日线图)时存在(错误),如果它是一对的。技术支持人员回答说,这种修改在时间和距离上都没有限制(传播范围并不重要)。

我将尝试用所有的建议做一些实验,我将在以后得出我的结论。

再次非常感谢你。

不客气。

这样使用:在开仓的 函数中,复制函数调用,而不是以点为单位的止损,其中你以点为单位的止损。或者直接输入停止价格--编译器会选择所需的函数。获利的情况也是如此。

例子。

double price=SymbolInfoDouble(Symbol(),SYMBOL_ASK);         // Цена открытия для Buy
double sl=CorrectStopLoss(Symbol(), OP_BUY, price, 200);    // Стоп в 200 пунктов (вместо пунктов можно вписать расчётную цену, например Ask+200*Point() или значение цены МА)
double tp=CorrectTakeProfit(Symbol(), OP_BUY, price, 300);  // Тейк в 300 пунктов (если вписать расчётную цену, то будет использоваться тип функции с double-параметром)
OrderSend(Symbol(),OP_BUY,Lots,price,slippage,sl,tp,"Комментарий ордера",Magic,0,clrBlue);
 
Vitaly Muzichenko:

好吧,我来回答:有一个1.0520的价格,在计算中我们得到了数字(int)Comm,然后我们需要从价格中加上/减去它=1.0520+(int)Comm ?现在,为了不乘以点--这是立即进行的。


好吧,那么也许是这样。只是,最初提出的问题是如何将佣金转化为点数,而不是转化为价格。
 
Artyom Trishkin:

不客气。

使用这种方式:在开仓 的函数中代替以点为单位的止损,输入你想代替以点为单位的止损的函数的调用。或者应该直接输入止损价--编译器选择所需的函数。获利的情况也是如此。

例子。

再次,非常感谢你。一切顺利。
 
请指教 尊敬的先生们:我画的斐波那契线有不同的颜色和风格层次,而且总是设置成与上一个相同,如何解决?

                  ObjectCreate(0,Fibo_Arrow,OBJ_FIBO,0,Time[0],Close[0],Time[0],price); // создание метки стпа на графике   
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_HIDDEN,true);        // Запрет на показ имени графического объекта в списке объектов 
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_SELECTABLE,false);   // запрет на выделение перемещение объекта мышью   
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_RAY_RIGHT,false);    // луч вправо
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_TOOLTIP,"r\n");       // подпись линии и и её длины в подсказку                  
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_COLOR,1,clrNONE);       // цвет   
                  
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELS,3);           // установим количество уровней   
                      
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,0,1.5);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,0,Green);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,0,2);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,0,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,0,"0.5"); // описание уровня 
                  
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,1,2);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,1,Lime);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,1,0);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,1,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,1,"1"); // описание уровня 
                  
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,2,2.5);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,2,Green);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,2,2);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,2,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,2,"1.5"); // описание уровня 
 
Money_Maker:
尊敬的专家,请指教:我用不同的颜色和风格的水平 建立斐波那契线,但总是设置为与上一个相同,如何解决? 重新绘制和滑动在任何地方都没有帮助(

用这个对象的飞博水平,你不能为每条线做不同的风格和颜色。如果你想要一个彩虹,就画出单独的线条。
原因: