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

 


Как правильно использовать функцию RefreshRates() ? 

 int ticket;
   while(true)
     {
      ticket=OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,0,"комментарий эксперта",255,0,CLR_NONE);
      if(ticket<=0)
        {
         ......
         RefreshRates();
        }
      else
        {
         .....
        }
     }

Еще прочитал на форуме "ERROR: code=138 - requote"

У меня "OrderSend error 138" генерируется в тестере по несколько раз в секунду.. это реквот? Если это так, то как с ним бороться?)

 

После прочтения 20 тем про реквот... наконец-то понял в чем у меня ошибка)

У меня был "псевдо"-реквот. Причиной тому условие для входа, которое срабатывало и соответственно цена была передана в .. А в действительности настоящая цена была ниже или выше заявленной в . И каждый раз когда OrderSend пытался открывать ордер, естественно выдавал ошибку 138.

Решением было перед OrderSend поставить проверку настоящей цены, равна-ли она цене переданной сигналом)

RefreshRates();
      if (Bid == (цена переданная сигналом на продажу))
         OrderSend (....); //продажа

Осталось сделать проверку над ошибками для ордеров OrderModify.. т.к. это может привести к плохим последствиям - не установке стопа!

Для OrderSend думаю проверки не нужно, пусть долбится до потери пульса по той цене которую дает сигнал) Если реквот и придет, то не критично.. купить или продать успею. Главное чтоб все работало по плану)

 
ALex2008 писал(а) >>

После прочтения 20 тем про реквот... наконец-то понял в чем у меня ошибка)

У меня был "псевдо"-реквот. Причиной тому условие для входа, которое срабатывало и соответственно цена была передана в OrderSend.. А в действительности настоящая цена была ниже или выше заявленной в OrderSend. И каждый раз когда OrderSend пытался открывать ордер, естественно выдавал ошибку 138.

Решением было перед OrderSend поставить проверку настоящей цены, равна-ли она цене переданной сигналом)

Осталось сделать проверку над ошибками .для ордеров OrderModify.. т.к. это может привести к плохим последствиям - не установке стопа!

Для OrderSend думаю проверки не нужно, пусть долбится до потери пульса по той цене которую дает сигнал) Если реквот и придет, то не критично.. купить или продать успею. Главное чтоб все работало по плану)

RefreshRates();
полезно делать перед обращеним к Ask Bid

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

 
YuraZ >>:

RefreshRates();
полезно делать перед обращеним к Ask Bid

Разве я не так сделал?.. перед обращением к Bid

if (Bid == (цена переданная сигналом на продажу))

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

Пояните плиз.. Т.е. в моем случае тут он не нужен? т.к. не считае, а сравнивает? Я правильно понял?
 
ALex2008 писал(а) >>

Разве я не так сделал?.. перед обращением к Bid


Пояните плиз.. Т.е. в моем случае тут он не нужен? т.к. не считае, а сравнивает? Я правильно понял?

Вы все правльно сделали :-)

он там не помешает!

просто у вас блок где вы обращаетесь к ценам должен быть желательно в одном месте

и предпочтительней иметь перед обращением иметь эту команду

вы обратившись к Bid Ask расчитав все стопы должы иметь сразу вход! в рынок без особых задержек

---

вы вот что добавьте в код

даю упрощенно

1-получен сигнал - взвели флаг на исполнение

2-refresh() расчет тейков стопов

3-вход

4-сервер отверг

5-декодируем ошибку

6-сигнал еще дейсвует - флаг на исполнение взведен ?

7- идем на п 1

и грамотно необходимо разрулить это цикл

т к он может стать достаточно долгим

а нужно

1-определиться с ошибкой

2 пытаться долбить диллера не так долго как это подразумевает цикл

2.1 например вы можете сделать счетчик сколько раз долбить

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

2.3 НЕОБХОДИМО до каждой серии до того как отдать команды на исполнение отслеживать а есть ли сигнал!

а то может отменить уже пора

 
YuraZ >>:

...просто у вас блок где вы обращаетесь к ценам должен быть желательно в одном месте

и предпочтительней иметь перед обращением иметь эту команду

вы обратившись к Bid Ask расчитав все стопы должы иметь сразу вход! в рынок без особых задержек

В одном месте.. Не совсем понял.. С логикой проблемы) Вон индикатор делаю уже сколько времени и не могу цикл доделать)))

У меня вот так это выглядит:

-цена для входа выдается функциями  UpTrend() и DownTrend() которые проверяют наличие сигнала

-проверка (if) на равенство цены с ценой от сигнала

-цена на вход и тп обрабатывается в OrderSend  

-цена стопа обрабатывается в функции ModifyPos(), которая следует за OrderSend

  

1-получен сигнал - взвели флаг на исполнение               //функция проверки сигнала передает функции установки ордера
2-refresh() расчет тейков стопов                                     // проверка соответствия цены - цене от сигнала  (если он ещё действует)
3-вход                                                                           // расчет тейков статический в OrderSend, стопов - в функции OrderModify
4-сервер отверг                                                             //если не установился ордер и дествует сигнал, то входим снова по цене сигнала  (если он ещё действует)
5-декодируем ошибку                                                     //нужно для себя, вдруг новая проблема..
6-сигнал еще дейсвует - флаг на исполнение взведен ? //условие соответствия цены - цене от сигнала  (если он ещё действует)
7- идем на п 1                                                               //п 3

и грамотно необходимо разрулить это цикл
т к он может стать достаточно долгим                            //долгим на столько сколько будет цена==цена сигнала, думаю не очень долгим, но частым может быть)
а нужно 

1-определиться с ошибкой                                                                  //над этим думаю сегодня поработать, поищу примеры на форуме
2 пытаться долбить диллера не так долго как это подразумевает цикл //цена==цена сигнала
2.1 например вы можете сделать счетчик сколько раз долбить            //надо подумать над этим, посмотреть на истории  в тестере
2.2 вы можете по кванту времени долбить                                          //могу  пропустить цена==цена сигнала (если он ещё действует)
2.3 НЕОБХОДИМО до каждой серии до того как отдать команды на исполнение отслеживать а есть ли сигнал!
а то может отменить уже пора                                                           //функция проверки сигнала передает функции установки ордера


 

Теперь вот не пойму как правильно реализовать OrderModify ? Без него не могу установить стоп.. ограничение ДЦ при открытии..

- можно получить ошибку 130, если цена после открытия изменится и он окажется ближе

-можно получить ошибку 138 реквот и цена уйдет выше и тогда стоп вообще не установится

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

Так...

сигнал действует

RefreshRates
();
      if (Bid == (цена сигнала))
         {
            OrderSend(Symbol(), OP_SELL, Lot, (Low_candl - Proboy*Point), Slippage, 0, ldTake, lsComm, MAGIC,0, clOpenSell);
            OrderModify(....);
         }  

Минусы этого варианта

-если цена уйдет ниже цены открытия, стоп не поставится никогда

-будет постоянно пытаться модифицировать ордер пока  выполняется условие. Или не будет?


или так...


сигнал действует

RefreshRates
();
      if (Bid == (цена сигнала))
         OrderSend(Symbol(), OP_SELL, Lot, (Low_candl - Proboy*Point), Slippage, 0, ldTake, lsComm, MAGIC,0, clOpenSell);
OrderModify(....);  

Минусы этого варианта

-будет очень много ошибок 130 если цена уйдет против


 

Пока рассматриваю такой вариант на стоп, ставить пока не выставится)

void ModifyPos()
   {
        if (OrderSelect(0,SELECT_BY_POS)==true) // Если есть открытый ордер
            { 
               if (OrderType()==OP_BUY)
                     double SLB = Bid-Stop*Point;
                     bool ModifyB = OrderModify(OrderTicket(),OrderOpenPrice(),SLB,OrderTakeProfit(),0,Red);
                        if (ModifyB == false)
                           for (int i=0; ModifyB==true; i++)
                              {
                                 SLB = SLB+i*Point;
                                 RefreshRates();
                                 ModifyB;
                              }
               if (OrderType()==OP_SELL)
                     double SLS = Ask+Stop*Point;
                     bool ModifyS = OrderModify(OrderTicket(),OrderOpenPrice(),SLS,OrderTakeProfit(),0,Red);
                        if (ModifyS == false)
                           for (int j=0; ModifyS==true; j++)
                              {
                                 SLS = SLS+j*Point;
                                 RefreshRates();
                                 ModifyS;
                              }                                                   
            }      
   }

Но есть ошибки в строках с ModifyB; ModifyB;

- ';' - variable already defined 

- ';' - variable already defined 




 

Еще как вариант, но тоже с ошибками (

void ModifyPos()
   {
        if (OrderSelect(0,SELECT_BY_POS)==true) // Если есть открытый ордер
            { 
               if (OrderType()==OP_BUY)
                     double SLB = Bid-Stop*Point;
                     bool ModifyB = OrderModify(OrderTicket(),OrderOpenPrice(),SLB,OrderTakeProfit(),0,Red);
                        if (ModifyB == false)
                           for (int i=0 ;; i++)
                              {
                                 SLB = SLB+i*Point;
                                 RefreshRates();
                                 bool ModifyB = OrderModify(OrderTicket(),OrderOpenPrice(),SLB,OrderTakeProfit(),0,Red);
                                    if (ModifyB==true)
                                       continue; 
                              }
               if (OrderType()==OP_SELL)
                     double SLS = Ask+Stop*Point;
                     bool ModifyS = OrderModify(OrderTicket(),OrderOpenPrice(),SLS,OrderTakeProfit(),0,Red);
                        if (ModifyS == false)
                           for (int j=0 ;; j++)
                              {
                                 SLS = SLS+j*Point;
                                 RefreshRates();
                                 bool ModifyS = OrderModify(OrderTicket(),OrderOpenPrice(),SLS,OrderTakeProfit(),0,Red);
                                    if (ModifyS==true)
                                       continue; 
                              }                                                   
            }      
   }
 
ALex2008 писал(а) >>

Еще как вариант, но тоже с ошибками (

ticket=OrderSend(symb,bs,lot,op,slippage,0,0,comm,magic);
      if(ticket==-1) {
Print("Не получилось открыть ордер, ошибка ",GetLastError());
      }
      if(ticket>0) {
         OrderSelect(ticket,SELECT_BY_TICKET);
         if(OrderType()==OP_BUY) {
            sl=расчет стопа;
            tp=расчет тейка;
         }
         if(OrderType()==OP_SELL) {
            sl=расчет стопа;
            tp=расчет тейка;
         }
         ...Проверка стопов на стоплевел
            if(!OrderModify(ticket, OrderOpenPrice(), sl, tp, 0, CLR_NONE)) {
               Print("Не получилось модифицировать ордер, ошибка ",GetLastError());
           }
Попробуйте так.