Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 210

 

Добрый день.

Моя стратегия учитывает величину спреда, спред определяется функцией:

double Spread_(){
   double spread = 0.0;
     RefreshRates();
     spread = MathRound((Ask - Bid) / Point);
   return(spread);
}   

Но так как в тестере стратегий спред постоянен, возникла потребность в эмуляторе случайного спеда. Чтоб в тестере эмулировать изменения спреда, в диапазоне от 2 до 3 пунктов (4 знака) в 80% случаев, и больше 3 пунктов в 20%. Может есть идеи как это реализовать, или ссылки где подобная идея решалась.

 
artmedia70:


Ошибка с магиком приводит к тому, что при закрытии по стопу советник ваш не видит, что его позиция закрыта по стопу. Почему? Отвечаю: вы открываете позиции с магиком 123, а в функцию проверки закрытия по стопу отсылаете переменную Magic. Как думаете, чему она равна при неявной инициализации? Нулю. Естественно в функции ищутся позиции с магиком 0, а он у ваших позиций равен 123. И мы не спорим, а так... рассуждаем сленца... Проверяйте реагирование на закрытия по стопу:


Остальную вашу "мёртвую" логику советника я не глядел - я вам помогал разобраться с функцией проверки закрытия по стопу...


Артем ! Добрый день! Еще раз спасибо за помощь.

Убрал всю лишнюю "мертвую" логику и "оживил" оставшуюся.... по мере своего понимания.

Оставил практически только функцию,которую Вы помогли мне исправить.

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

1. В том виде как у Вас советник открывает сделки на начале каждой свечи(у меня 5 минутки)

игнорируя при этом все указанные условия

Т.е. управление попадает в первую строку

double Price=iOpen(Symbol (),0,0);

а потом почему перепрыгивает через 11 строк и попадает в строки

Lot=0.1;

OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );

2.Если же удалить строку вычисляющую минимальный лот Lot=MarketInfo(Symbol(), MODE_MINLOT);

советник работает нормально, но функция isCloseLastPosByStop не работает.

Очень долго напрягал свои извилины.....но тщетно.Буду Вам признателен если подскажете где прячется ошибка.

double   Lot = 0.1;                                          //я проинициализировал переменную
int      Magic=123;

int start() 
{

   double Price=iOpen(Symbol (),0,0);                      //запоминаем время открытия очередной свечи
   int ot=OrdersTotal();                                   //запоминаем количество всех открытых ордеров
      if ((ot==0)                                         //если ордеров в рынке никаких нет
      &&(Bid==Price)                                     //И ПРИ ЭТОМ  если  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)      //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)       //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
                &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))  //И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
                
                  Lot=MarketInfo(Symbol(), MODE_MINLOT);                  //вычислить минимальный лот инструмента
                               
                  if (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
                     {                                                   //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
                     t=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                  else                                                    //в противном случае(если функция на вернула ??????
                     {
                     Lot=0.1;                                             // лот отстается 0.1       
                     OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                      
   return(0);
}
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
   double   pt;
   int      dg, i, j=-1, k=OrdersHistoryTotal()-1;
   datetime t=0;                                   // во избежание возможных ошибок после возможных будущих улучшений
   for (i=k; i>=0; i--) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)        continue;   // если символ не тот, переходим к следующему
         if (OrderType()!=op)          continue;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);      // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
      if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
         }
      }
   return(False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}


 

solnce600:

Артем ! Добрый день! Еще раз спасибо за помощь.

Всю свою " мертвую логику" убрал лишнюю и "оживил" оставшуюся.... по мере своего понимания.

Оставил практически только функцию,которую Вы помогли мне исправить.

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

После

 if ((ot==0)                                         //если ордеров в рынке никаких нет
      &&(Bid==Price)                                     //И ПРИ ЭТОМ  если  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
               &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))

добавте все в тело { }

Извените, что я не Артем.

 
ALXIMIKS:

solnce600:

После

добавте все в тело { }

Извените, что я не Артем.

Спасибо .На первый раз прощаю.......(не знаю как добавить шутливый смайлик)
 
 t=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );

так t или все таки Lot ???

 
ALXIMIKS:

solnce600:

После

добавте все в тело { }

Извените, что я не Артем.

Сделал как ты сказал.....увы советник работает ....функция isCloseLastPosByStop не работает

double   Lot=0.1;
int      Magic=123;

int start() 
{

   double Price=iOpen(Symbol (),0,0);  //запоминаем время открытия очередной свечи
   int ot=OrdersTotal();               //запоминаем количество всех открытых ордеров
      if ((ot==0)                      //если ордеров в рынке никаких нет
      &&(Bid==Price)                   //И ПРИ ЭТОМ  если ПРИ ЭТОМ  цена = цене открытия очередной свечи
         &&(Open[1]-Close[1]>100*Point&&Open[1]-Close[1]<120*Point)//И ПРИ ЭТОМ  если свеча N1 соответствуе этим параметрам
            &&(High[1]-Open[1]>40*Point&&High[1]-Open[1]<60*Point)
               &&(Close[1]-Low[1]>40*Point&&Close[1]-Low[1]<60*Point))
               
                {
                  Lot=MarketInfo(Symbol(), MODE_MINLOT);            //вычислить минимальный лот инструмента
                               
                  if (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot))//вызываем функцию,если она вернула(не понимаю-ведь функция
                     {                            //должна вернуть и положить сюда true или False,а здесь совсем другие передаваемые парам.)
                     Lot=Lot*2; // удваиваем начальный лот
                     OrderSend(Symbol(),OP_SELL,Lot,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                  else  //в противном случае(если функция на вернула??????
                     {
                     Lot=0.1; // лот отстается 0.1       
                     OrderSend(Symbol(),OP_SELL,1,Bid,Lot,Ask+1500*Point,Ask-300*Point,"jfh",123 );
                     }
                     } 
   return(0);
}
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
   double   pt;
   int      dg, i, j=-1, k=OrdersHistoryTotal()-1;
   datetime t=0;                                   // во избежание возможных ошибок после возможных будущих улучшений
   for (i=k; i>=0; i--) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;   // если магик не тот, переходим к следующему
         if (OrderSymbol()!=sy)        continue;   // если символ не тот, переходим к следующему
         if (OrderType()!=op)          continue;   // если тип не тот, переходим к следующему
         if (t<OrderCloseTime()) {
            t=OrderCloseTime();
            j=i;
            }
         }
      }
   if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
      dg=MarketInfo(OrderSymbol(), MODE_DIGITS);      // количество знаков в цене символа ордера
      pt=MarketInfo(OrderSymbol(), MODE_POINT);       // размер пункта инструмента в валюте котировки ордера
      if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
         }
      }
   return(False);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}
 

Ето кусок кода из функции bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)

А если проскальзование в 3 пиписьки? Не продумано как-то ))

 if (MathAbs(OrderClosePrice()-OrderStopLoss())<0.5*pt) { // Если закрыт по стопу
         ll=OrderLots();                              // записываем количество лотов в ордере, закрытом по стопу
         return(true);                                // возвращаем истину
 
solnce600:

Ты понимаешь - я пока на этом не заморачиваюсь....

Я целую неделю никак не могу понять почему не работает эта функция так как мне надо.

Т.е мне нужно что бы после стопа следующий ордер открылся двойным объемом от объема ордера закрывшегося по стопу,а после не стопа следующий ордер открылся обычным объемом.


Исправьте логику работы, а то еще долго будет думать
 
ALXIMIKS:

Ето кусок кода из функции bool isCloseLastPosByStop(string sy, int op, int mn, double &ll)

А если проскальзование в 3 пиписьки? Не продумано как-то ))


Ты понимаешь - я пока на этом не заморачиваюсь....

Я целую неделю никак не могу понять почему не работает эта функция так как мне надо.

Т.е мне нужно что бы после стопа следующий ордер открылся двойным объемом от объема ордера закрывшегося по стопу,а после не стопа следующий ордер открылся обычным объемом.
 

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

Если на щету будет торговать исключительно робот.

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