并让我们把它做成一个 "卡通"(多货币)。 - 页 7

 
Swan >> :

它是

当StopLoss为真时,新的值被分配。

否则,该命令将被修改。

没有错误,但你必须脱下十字架或穿上长裤)。

我没有马上明白))......这种情况可能不会导致停工!

也许我们应该删除其他的东西?似乎逻辑并没有受到...如果只有一个条件就够了,为什么我还需要第二个条件呢?

StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

或者是这样...

if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);


天鹅>>

见实数的比较。

我将阅读它...那么,这是否绝对必要呢?我只是没有做过)。

 
ALex2008 >> :

我并没有马上明白...这种情况可能不会导致停车!

我们就不能删除其他东西吗?似乎逻辑并没有受到影响...

也许)4h蜡烛通常比StopLevel大...


ALex2008>>

我将阅读它...我的意思是,这真的有必要吗?我只是从未这样做过)

当比较值几乎相等时,会发生各种奇怪的事情)

当检查一个双重类型的数字是否相等时--强制。


 StopLoss-Ask< StopLevel-0.5*Point

俄语:StopLoss减去Ask小于StopLevel,精度为0.5*Point。

(StopLoss,Ask,StopLevel均已归一化)

 
StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
//StopLoss может присвоиться новое значение, желательно и его проверить на StopLevel
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
这有点乱,但你必须考虑一下)。
 

那么这个选项呢?保留它似乎是合理的...

if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

我们还应该检查交易环境,否则我们会得到它很忙的错误 - TradeDispatcher: trade context is busy ...事实证明,如果有大量的EA副本,所有这些副本同时 关闭其符号上的当前订单并设置新的订单...会形成交通堵塞)

这可能是它的工作方式...

//-------Поиск входа для установки ордеров, удаление старых ордеров и установка новых
void UpTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) <= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) > 0)){
         Enter=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
         if(IsTradeAllowed()){
            DellAllOrders();
            if(Ask< Enter- StopLevel+0.5*Point){
               OrderSend(Symbol(), OP_BUYSTOP, 0.1, Enter, 0, 0, Enter+ Profit, 0, 0,0, Green);}
         else Sleep(1000);
         }
      }
  }
void DownTrend(){
     if((iOpen(NULL,PERIOD_H4,1) - iClose(NULL,PERIOD_H4,1) >= 0) &&
        (iOpen(NULL,PERIOD_H4,2) - iClose(NULL,PERIOD_H4,2) < 0)){
         Enter=iLow(NULL,PERIOD_H4,1)-10*Point;
         if(IsTradeAllowed()){
            DellAllOrders();
            if(Bid> Enter+ StopLevel-0.5*Point){
               OrderSend(Symbol(), OP_SELLSTOP, 0.1, Enter, 0, 0, Enter- Profit, 0, 0,0, Green);}
         else Sleep(1000);
         }
      }
  }

也就是说,在关闭当前订单并设置新的挂单之前,我们要检查交易流程...如果是忙,暂停1秒钟。

 
ALex2008 >> :

那么这个选项呢?似乎明智的做法是保留它...

if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

不,这就是它的工作方式。我们必须下定决心)。

三个选项。

            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
            if( StopLoss-Ask> StopLevel-0.5*Point)
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=Ask+ StopLevel;//+x*Point
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

            StopLoss=MathMin( s0, s1);//Функция возвращает минимальное из двух числовых значений
            if( StopLoss-Ask> StopLevel-0.5*Point)
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

ALex2008 写道>>

另外,我们需要检查贸易线程,否则它可能会出现繁忙的错误......。因为如果有许多图表,它们都会在同一时间关闭当前的订单...
int start() {
   if(!IsTradeAllowed()) return(0);

如果没有帮助,在所有的OrderSend,OrderModify,OrderClose,OrderDelete检查IsTradeContextBusy()。


ALex2008 >>:
只有在正确的位置上,我认为...我的意思是,例如,旧的订单不会因为线程繁忙而被删除,但程序必须下新的订单......而程序必须在所有旧的订单被删除后才下新的订单。

在函数UpTrend()和DownTrend()的检查条件中,订单被删除和放置。

太多不同的东西)

 
Swan >> :

不,这就是它的工作方式。>>你得下定决心)。

我不明白,到底会不会?)

 
ALex2008 >> :

我不明白--它到底能不能用?))

*不会发生。

在你的最后一个变体中。

         if( Type==0){
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point) StopLoss=MathMax( b0, b1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);

在第一个if()中没有定义StopLoss。

 
Swan >> :

*不会发生。

在你的最后一个变体中。

在第一个if()中没有定义StopLoss。


那么它是什么呢?

在第一种情况下,止损点是两个蜡烛图的最低点(价格)......也就是说,离订单很远

StopLoss=MathMin(b0,b1); 

在第二种情况下,如果止损点收到2个蜡烛图的最大(价格)低点,即它接近于订单


StopLoss=MathMax(b0,b1);
 
ALex2008 >> :
         if( Type==0){
//здесь StopLoss нипанятно какой)
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point) StopLoss=MathMax( b0, b1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
 

//здесь StopLoss нипанятно какой)

究竟什么是不清楚的? 进入函数时,它是零。也许我不明白的东西....


上面有一个条件--如果订单是开放的,并且它的止损点=0,那么就放置一个止损点。

if ((Type<=1)&&(Stop==0))SetStop();

和函数本身来设置一个停止


//-------Вычисление стопа и установка
void SetStop(){
      RefreshRates();
      b0=iLow(NULL,PERIOD_H4,0)-10*Point;
      b1=iLow(NULL,PERIOD_H4,1)-10*Point;
      s0=iHigh(NULL,PERIOD_H4,0)+(Ask-Bid)+10*Point;
      s1=iHigh(NULL,PERIOD_H4,1)+(Ask-Bid)+10*Point;
            
         if( Type==0){
            if(Bid- StopLoss< StopLevel-0.5*Point) StopLoss=MathMin( b0, b1); 
            if(Bid- StopLoss> StopLevel-0.5*Point) StopLoss=MathMax( b0, b1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
         if( Type==1){
            if( StopLoss-Ask< StopLevel-0.5*Point) StopLoss=MathMax( s0, s1);
            if( StopLoss-Ask> StopLevel-0.5*Point) StopLoss=MathMin( s0, s1);
            OrderModify(OrderTicket(),OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
         }
   }