Учусь писать советника... - страница 6

 
ALex2008 >>:

Внимательно не спеша почитайте тему!

  пишу там о варианте

  пробивания входа! даже если БРОКЕР дает реквоту ... 

  

'код ошибки 138 и реал-счет'

 

Если вы про этот вариант и он относится к OrderModify

YuraZ писал(а) >>

допустим 

получен сигнал -

 на тике бъем на вход раз 5

  не пробили! вышли 

  на втором тике после сигнала входим и долбим далше!

..то я ещё не вырос до тиков)) Как их учитывать 1-й тик, 2-й тик?

Sleep(2000); // это 2 секунды ждать после ошибки

А ждать новый тик сколько?

 

 

 
Talex >>:
Попробуйте так.

У меня сейчас задача в уствновке стопа через OrderModify сразу после OpenSend и проверке наличия этого стопа

Если он не сработал, то больше не отслеживаем его, если нет, то какая ошибка и пытаться дальше ставить...ставить...и ставить...)

RefreshRates();   
           double SLS = Ask+Stop*Point;   //стоп на продажу
           Modify = OrderModify(OrderTicket(),OrderOpenPrice(),SLS,OrderTakeProfit(),0,Red);
              if (Modify == false)
                  {
                      Print("Ошибка при попытке установить стоп для SEL, код ошибки ="+GetLastError());
                      for (int j=0 ;; j++) //пытаемся пока ДЦ не умрет)
                             {
                                SLS = SLS+j*Point;   //увеличиваем стоп на 1 пп 
                                RefreshRates();
                                Modify = OrderModify(OrderTicket(),OrderOpenPrice(),SLS,OrderTakeProfit(),0,Red);
                                   if (Modify==true)
                                       break;
                                   else   
                                       Print("Ошибка при попытке установить стоп для SEL, код ошибки ="+GetLastError());        
                              }
                  }
 
Подскажите как проверить состояние OrderModify, чтоб после удачной модификации больше не пытаться модифить и не получать лишние  ошибки?
 
bool ModifyS = OrderModify(OrderTicket(),OrderOpenPrice(),SLS,OrderTakeProfit(),0,Red);
if (ModifyS==true) continue;

заменить на это:

ModifyS = OrderModify(OrderTicket(),OrderOpenPrice(),SLS,OrderTakeProfit(),0,Red);
if (ModifyS==true) break;

здесь:

1. зачем лишний раз определять тип переменной - это ошибка должна выскакивать при компиляции

2. вместо continue - переход к новой итерации (т.е. к новой попытке модификации), использовать break - выход из цикла (причём бесконечного, что не есть хорошо)

 
Xupypr >>:

1. зачем лишний раз определять тип переменной - это ошибка должна выскакивать при компиляции

Исправил)

2. вместо continue - переход к новой итерации (т.е. к новой попытке модификации), использовать break - выход из цикла 

Спасибо!

..причём бесконечного, что не есть хорошо..

Бесконечного потому что стоп нужно выставить обязательно..

А если сделаю пару попыток и будет отказ по какой-то причине и за это время цена уйдет далеко против позиции.. Что тогда делать?

 

Ошибки в журнале:

open #1 sell 0.01 EURUSD  ok
modify #1 sell 0.01 EURUSD  ok
Ошибка при попытке установить стоп для SEL, код ошибки =0
stop loss #1
open #2 sell 0.01 EURUSD ok
modify #2 sell 0.01 EURUSD  ok
Ошибка при попытке установить стоп для SEL,  код ошибки =0
stop loss #2
open #3 sell 0.01 EURUSD  ok
modify #3 sell 0.01 EURUSD  ok
Ошибка при попытке установить стоп для SEL, код ошибки =0

вход на SELL

RefreshRates();
      if ((OrdersTotal()==0)&&(Bid == Enter))  //бъем до упора эту цену
         { 
            if (IsTradeContextBusy()==false)
               {
                  OrderSend(Symbol(), OP_SELL, Lot, Enter, Slippage, 0, ldTake, lsComm, MAGIC,0, clOpenSell);
                  if (OrdersTotal()>0)
                     {
                        ModifySL();                   //ставим стоп
                        SLBU = OrderOpenPrice()-BU;               //цена БУ
                     }   
                  else Print("Ошибка при попытке установить ордер на SELL, ",OrderOpenPrice()," код ошибки ="+GetLastError());             
               }
         }




модифи SELL





void ModifySL() 
   {
      if (OrderSelect(0,SELECT_BY_POS)==true) // Если есть открытый ордер
         {       
            if (OrderType()==OP_BUY)
               {
                  RefreshRates();
                  OrderModify(OrderTicket(),OrderOpenPrice(),Bid-StopL*Point,OrderTakeProfit(),0,Red);
                  if (OrderStopLoss()==0) Print("Ошибка при попытке установить стоп для BUY, ",OrderStopLoss()," код ошибки ="+GetLastError());

               }
                               
            else
                  RefreshRates();   
                  OrderModify(OrderTicket(),OrderOpenPrice(),Ask+StopL*Point,OrderTakeProfit(),0,Red);
                  if (OrderStopLoss()== 0) Print("Ошибка при попытке установить стоп для SEL, ",OrderStopLoss()," код ошибки ="+GetLastError());
               }
         } 
   }




 
ALex2008 >>:

Если вы про этот вариант и он относится к OrderModify

..то я ещё не вырос до тиков)) Как их учитывать 1-й тик, 2-й тик?

Sleep(2000); // это 2 секунды ждать после ошибки

А ждать новый тик сколько?

 

 

при каждом тике

вызывается 

 START()

{

}

---

учтите что если вы долго находитесь в функции START

  вы вполне можете пропустить один или несколько  тиков

например вы зашли в функцию START и сидите в ней 10 минут,  логично что прийдут тики но вы их не поймате

хотя ночью тики могут не приходить достаточно долго

---

потому нахождение в START долгое время - плохо сказывается на поимке тиков ( если они Вам важны )

пишите экономные программы с минимумом циклов и задержек

---

 
YuraZ >>:

...учтите что если вы долго находитесь в функции START

  вы вполне можете пропустить один или несколько  тиков

например вы зашли в функцию START и сидите в ней 10 минут,  логично что прийдут тики но вы их не поймате

хотя ночью тики могут не приходить достаточно долго

---

потому нахождение в START долгое время - плохо сказывается на поимке тиков ( если они Вам важны )

пишите экономные программы с минимумом циклов и задержек

---

Если использовать ф-ю RefreshRates() перед модификацией или установкой ордера, то как раз обновляется состояние за пределами Start(), т.е. тиков? 

Я правильно понимаю?

 

Вот для критики конечный вариант открытия и модификации позы.

"+" и "-" этого варианта?

Открытие sell

RefreshRates();
      if ((OrdersTotal()==0)&&(Bid == Enter))  //бъем до упора эту цену
         { 
            if (IsTradeContextBusy()==false)
               {
                  OrderSend(Symbol(), OP_SELL, Lot, Enter, Slippage, 0, ldTake, lsComm, MAGIC,0, clOpenSell);
                  if (OrdersTotal()>0)
                     {
                        ModifySL();                   //ставим стоп
                        SLBU = OrderOpenPrice()-BU;               //цена БУ
                     }   
                  else Print("Ошибка при попытке установить ордер на SELL, ",OrderOpenPrice()," код ошибки ="+GetLastError());             
               }
         }




модификация стопа





void ModifySL()
   {
      if (OrderSelect(0,SELECT_BY_POS)==true) // Если есть открытый ордер
         {       
            if (OrderType()==OP_BUY)
               {
                  RefreshRates();
                  bool Modify = OrderModify(OrderTicket(),OrderOpenPrice(),Bid-StopL*Point,OrderTakeProfit(),0,Red);
                  if (Modify == false) Print("Ошибка при попытке установить стоп для BUY, ",OrderStopLoss()," код ошибки ="+GetLastError());

               }
            else
               {
                  RefreshRates();   
                  Modify = OrderModify(OrderTicket(),OrderOpenPrice(),Ask+StopL*Point,OrderTakeProfit(),0,Red);
                  if (Modify == false) Print("Ошибка при попытке установить стоп для SEL, ",OrderStopLoss()," код ошибки ="+GetLastError());
               }
         }     
   }
Причина обращения: