Проклятая ошибка 130 к черту - страница 3

 
delcor wrote >>

Вангрош

спасибо за информацию

не могли бы вы помочь мне понять

правильно ли это

я делаю советник с автоматическим трейлом

if(OrderType()==OP_SELL && OrderSymbol()==Symbol())

{
if (OrderStopLoss()==0)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); // размещаем TP и SL
}
if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) // размещаем TP
{
if(OrderStopLoss()>(Ask+Point*TrailingStop)+Point) // проверяем true
{
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red)) // если true, модифицируем ордер
Print("Error_Modify - ",GetLastError());
else str=StringConcatenate("\n Мой номер билета ", OrderTicket(), " и моя установка стоп-лосса ", DoubleToStr(Ask+Point*TrailingStop,Digits)); // новый код
}
}
}

Вот что я написал в другом посте, объясняя другой подход.

>>Здесь есть простое решение, просто проверяя, что новая цена стоплосса по крайней мере на 1 пункт или больше, чем старый стоплосс. Просто сделайте обратное для ордера на продажу.

      if (OrderType() == OP_BUY)
      {      
         if(Bid-OrderOpenPrice() > (Point* TrailingStop))
         {       
            double oldStopLoss = OrderStopLoss();
            double newStopLoss = Bid-Point* TrailingStop;
            double nextStopLoss = oldStopLoss + Point; // Adding 1 point to oldStopLoss, i.e. 76.78 to 76.79            
                       
            if( newStopLoss >= nextStopLoss) // checking that the new stoploss price is at least 1 point or greater then the old stoploss
            {                              
               OrderModify(OrderTicket(),OrderOpenPrice(), newStopLoss,0,0,Green);
               return;
            }
         }
      }


Вот полная функция, которую я использую. Теперь, когда я думаю об этом, я мог бы использовать лучшее имя var, чем nextStopLoss, и мне также следует добавить проверку ошибок в OrderModify().

Кроме того, моя функция трейлинг-стопа находится в советнике, который может иметь несколько ордеров, открытых одновременно, поэтому у нее есть эти параметры, чтобы я мог обновлять трейлинг-стоп для нескольких ордеров одновременно.

void CheckTrailingStop(int order_Ticket, int trailingStopValue)
{
   double oldStopLoss;
   double newStopLoss;
   double nextStopLoss;
   int _trailingStop = trailingStopValue;
   
   if ( order_Ticket < 0) return;
                                    
   if(OrderSelect( order_Ticket, SELECT_BY_TICKET, MODE_TRADES) == false)
   {
      Print("CheckTrailingStop() - OrderSelect returned the error of ", GetLastError());
      return;   
   }
         
   if (OrderType() == OP_BUY)
   {      
      if(Bid-OrderOpenPrice() > Point*_trailingStop)
      {       
         oldStopLoss = OrderStopLoss();
         newStopLoss = Bid-Point*_trailingStop;
         nextStopLoss = oldStopLoss + Point; // Adding 1 point to oldStopLoss, i.e. 76.78 to 76.79            
                    
         if( newStopLoss >= nextStopLoss)
         {                              
            OrderModify(OrderTicket(),OrderOpenPrice(), newStopLoss,0,0,Green);
            return;
         }
      }
   }
                                             
   if (OrderType() == OP_SELL)
   {               
      if(OrderOpenPrice()-Ask > Point*_trailingStop)
      {
         oldStopLoss = OrderStopLoss();
         newStopLoss = Ask+Point*_trailingStop;
         nextStopLoss = oldStopLoss - Point; // Subtracting 1 point from oldStopLoss, i.e. 76.78 to 76.77
                    
         if( newStopLoss <= nextStopLoss || (OrderStopLoss() == 0))
         {                              
            OrderModify(OrderTicket(),OrderOpenPrice(), newStopLoss,0,0,Green);
            return;
         }
      }
   }
}

Затем в моей функции start():

void start()
{                      
   if ( validTimePeriod == false) return;
   if ( validTrailingStop == false) return;
        
   //---- Start Main program ----
   Main();
   
   if ( EnableHedging == true)
   {
      HedgeStopLossCheck();
      CheckHedges();
   }
   
   if ( TrailingStop > 0) CheckTrailingStop( currentOrderTicket, TrailingStop);               
           
   CheckWaiting();
   
   GetOpenTradeLots();   
      
   CheckIfCurrentOrder_Closed();
}

Я оставил здесь вызовы других функций, просто чтобы вы могли видеть, что я люблю разделять свой код на конкретные функции, насколько это возможно. Это значительно упрощает работу.

Удачи с вашим советником.

 
vangrosh:

Вот что я написал в другом сообщении, объясняя другой подход.

>>Вот легкое решение, просто проверяя, что новая цена стоплосса по крайней мере на 1 пункт или больше, чем старый стоплосс. Просто сделайте обратное для ордера на продажу.


Вот полная функция, которую я использую. Теперь, когда я думаю об этом, я мог бы использовать лучшее имя var, чем nextStopLoss, и мне также следует добавить проверку ошибок в OrderModify().

Кроме того, моя функция трейлинг-стопа находится в советнике, который может иметь несколько ордеров, открытых одновременно, поэтому у нее есть эти параметры, чтобы я мог обновлять трейлинг-стоп для нескольких ордеров одновременно.

Затем в моей функции start():

Я оставил здесь вызовы других функций, просто чтобы вы могли видеть, что я люблю разделять свой код на конкретные функции, насколько это возможно. Это значительно упрощает работу.

Удачи с вашим советником.

Спасибо - выглядит хорошо

Так вы размещаете функцию start() в нижней части советника?

 
У меня тоже проблема с ужасной ошибкой. Дело в том, что у меня нет стоп-лосса или тейк-профита, он просто не может разместить отложенный ордер, на много пунктов от рынка, где не должно быть проблем...
 
TheEconomist wrote >>
У меня тоже есть проблема с ужасной ошибкой. Дело в том, что у меня нет стоп-лосса или тейк-профита, он просто не может разместить отложенный ордер, на много пунктов от рынка, где не должно быть проблем...

Проблема со старым добрым 130 в том, что он указывает (одну из) класса или группы ошибок и не приводит к какому-либо мгновенному исправлению...
Вы даже можете устранить проблему, а она все еще там.

Единственное, что здесь встречается - это опечатка?

Может быть, вы вводите Buy Limit выше Ask, когда вы намеревались выставить Buy Stop ордер?

FWIW

-BB-

 
BarrowBoy:

Проблема со старым добрым 130 в том, что он указывает (одну из) класса или группы ошибок и не приводит к мгновенному исправлению...
Вы можете даже исправить проблему, а она все еще там...

Единственное, что здесь встречается - это опечатка?

Возможно, вы вводите Buy Limit выше Ask, в то время как вы намеревались выставить Buy Stop ордер?

FWIW

-BB-

У меня есть функция, которая выбирает тип операции:

int SellOperation(double ToCompare)
  {
   int op;
   if (Bid> ToCompare)
     op=OP_SELLSTOP;
   if (Bid== ToCompare)
     op=OP_SELL;
   if (Bid< ToCompare)
     op=OP_SELLLIMIT;        
   return( op);   
  }
  
  
int BuyOperation(double ToCompare)
  { 
   int op;
   if (Ask> ToCompare)
     op=OP_BUYLIMIT;
   if (Ask== ToCompare)
     op=OP_BUY;
   if (Ask< ToCompare)
     op=OP_BUYSTOP;
   return( op);
  }

int WhatOperation(int operation, double ToCompare)
  { 
   if ( operation==OP_BUY)
     return( BuyOperation( ToCompare));
   if ( operation==OP_SELL)
     return( SellOperation( ToCompare));     
  }       

вот так:

09:28:46 2008.06.09 00:00 ForexCraft2 EURGBP, Daily: Открытие продажи на уровне 2 для пилона 0 @ 0.8024 при биде = 0.8016
09:28:46 2008.06.09 00:00 ForexCraft2 EURGBP,Daily: Ошибка отправки ордера 130
09:28:46 2008.06.09 00:00 ForexCraft2 EURGBP,Daily: ReliableOrderSend error : 130: Недействительные стопы.


 

Здравствуйте, TheEconomist

Просто несколько коротких замечаний...

1. Не вижу нормализации на ToCompare, если только WhatOperation() гарантированно не нормализует фактические данные.

2. У двойных сравнений есть проблемы - например, 'Conditional Statement failure... [В конце концов] if ( 1.4225 > 1.4225) is NOT TRUE!!!!!!'.

3. Следуете ли вы руководству https://book.mql4.com/appendix/limits?

С уважением,

 

Я изучал этот пост в надежде решить мою ошибку в 'Quick Question' с 130. Функция отправки заказа есть, также как и записи журнала с функцией печати, знает ли кто-нибудь из вас, что происходит?

Спасибо,

Мальчик Бауэр

 

.

как видно на .../24681

if( isBuying ) 
{ 
  if( stopLoss > 0)
  ACCTSL = Ask - ( stopLoss*Point* MyDig);

  if( takeProfit > 0)
  ACCTTP = Ask + ( takeProfit*Point* MyDig);
  // Buy
  ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, slippage, ACCTSL, ACCTTP, 
  nameEA, 16384,0,Red); 
  Print ("Stop Loss Value", ACCTSL);
  Print ("Take Profit Value", ACCTTP);

1. StopLevel= MarketInfo(Symbol(),MODE_STOPLEVEL);

SL, TP должны быть удалены от Bid на расстояние не менее StopLevel пунктов.

См. ниже (**)


2. ACCTxx = NormalizeDouble(Ask ...(...), Digits);


3. Print("Bid=",DoubleToString(Ask,Digits),", Ask=",DoubleToString(Bid,Digits));


4. Print("Stop Loss Value",DoubleToString( ACCTSL,Digits),", stopLoss="",stopLoss);
Print ("Значение тейк-профита", DoubleToString(ACCTTP,Digits),", takeProfit=",takeProfit);

Почему DoubleToString()? Print() отображает только ЧЕТЫРЕ цифры.



Кстати, я бы еще сделал хотя бы один раз Print("MyDig=",MyDig); Зачем? ни в коем случае нельзя потом об этом беспокоиться. Может показаться мелочью, но вы будете удивлены, сколько забавных моментов связано с такими простыми вещами!


5. ВСЕ ваши проблемы могут быть легко решены, если вы получите всю доступную информацию под рукой и отобразите ее.

Затем, с помощью старой доброй бумаги + карандаша, вы можете увидеть, где есть недоразумения.



(**)

Ссылка: https://book.mql4.com/appendix/limits

Ограничение минимального расстояния StopLevel.

Торговая операция не будет выполнена, если нарушено любое из следующих условий.

Тип ордера Цена открытия StopLoss (SL) TakeProfit (TP)
Купить
Модификация запрещена Bid-SL ≥ StopLevel TP-Bid ≥ StopLevel
Продать
Модификация запрещена SL-Ask StopLevel Ask-TP StopLevel
BuyLimit
Ask-OpenPrice StopLevel OpenPrice-SL StopLevel TP-OpenPrice StopLevel
SellLimit
OpenPrice-Bid StopLevel SL-OpenPrice StopLevel OpenPrice-TP StopLevel
BuyStop
OpenPrice-Ask StopLevel OpenPrice-SL StopLevel TP-OpenPrice StopLevel
SellStop
Bid-OpenPrice StopLevel SL-OpenPrice StopLevel OpenPrice-TP StopLevel

 
fbj wrote >>

.

как видно на .../24681

1. StopLevel= MarketInfo(Symbol(),MODE_STOPLEVEL);

SL, TP должны быть удалены от Bid на расстояние не менее StopLevel пунктов.

См. ниже (**)


2. ACCTxx = NormalizeDouble(Ask ...(...), Digits);


3. Print("Bid=",DoubleToString(Ask,Digits),", Ask=",DoubleToString(Bid,Digits));


4. Print("Stop Loss Value",DoubleToString( ACCTSL,Digits),", stopLoss="",stopLoss);
Print ("Значение тейк-профита", DoubleToString(ACCTTP,Digits),", takeProfit=",takeProfit);

Почему DoubleToString()? Print() отображает только ЧЕТЫРЕ цифры.



Кстати, я бы еще сделал хотя бы один раз Print("MyDig=",MyDig); Зачем? ни в коем случае нельзя потом об этом беспокоиться. Это может показаться мелочью, но вы будете поражены тем, какие забавные вещи окружают такие простые вещи!


5. ВСЕ ваши вопросы могут быть легко решены, если вы получите всю доступную информацию под рукой и отобразите ее.

Затем, с помощью старой доброй бумаги + карандаша, вы можете увидеть, где есть недоразумения.



(**)

Ссылка: https://book.mql4.com/appendix/limits

Ограничение минимального расстояния StopLevel.

Торговая операция не будет выполнена, если нарушено любое из следующих условий.

Тип ордера Цена открытия StopLoss (SL) TakeProfit (TP)
Купить
Модификация запрещена Bid-SL ≥ StopLevel TP-Bid ≥ StopLevel
Продать
Модификация запрещена SL-Ask StopLevel Ask-TP StopLevel
BuyLimit
Ask-OpenPrice StopLevel OpenPrice-SL StopLevel TP-OpenPrice StopLevel
SellLimit
OpenPrice-Bid StopLevel SL-OpenPrice StopLevel OpenPrice-TP StopLevel
BuyStop
OpenPrice-Ask StopLevel OpenPrice-SL StopLevel TP-OpenPrice StopLevel
SellStop
Bid-OpenPrice StopLevel SL-OpenPrice StopLevel OpenPrice-TP StopLevel

Не могу понять, что происходит и почему это происходит.

2009.08.05 14:32:26 Trender Beta Test EURUSD,H1: OrderSend (Trender Beta Test ) failed with error #130

2009.08.05 14:32:26 Trender Beta Test EURUSD,H1: MyDig=10

2009.08.05 14:32:26 Trender Beta Test EURUSD,H1: Take Profit Value1.43155, takeProfit=110

2009.08.05 14:32:26 Trender Beta Test EURUSD,H1: Stop Loss Value1.42255, stopLoss=200

2009.08.05 14:32:26 Trender Beta Test EURUSD,H1: Bid=1.44255, Ask=1.44229







 
Bauer_Boy wrote >>

Не могу понять, что происходит и почему это происходит.

Действительно пришло время показать весь код. Если вы сомневаетесь, вы можете использовать PM.

Я вижу, что у вас TP ниже, чем Bid

Причина обращения: