Пишу советник. Ничего нового пока. Нужна помощь профи. Не открываются ордера.

 
property strict
//------------------------------------------------------------------------------------------------
input double          StartLots       = 0.01;     // Start lot
input double          MaximalLots     = 2.56;     // Maximal Lots 
input int             OrderStep       = 195;     
input int             MinProfit       = 60;       // Minimal profit for close grid (in pips)
//---
input ENUM_TIMEFRAMES TF_ATR          = PERIOD_CURRENT; // Тайм Фрейм для ATR
input int             Per_MA          = 5;
input int             Level_Up        = 24;
input int             Level_Dn        = 24;
//---
input int             MagicNumber     = 227;      // Magic Number (in number)
input int             Slippage        = 30;       // Slippage (in pips)

 //************************************************************************************************/
int OnInit()
  {
   Comment("");
   return(INIT_SUCCEEDED);
  }
//************************************************************************************************/
//*                                                                                              */
//************************************************************************************************/
void OnTick()
{                    
   double BuyPriceMin=0,SelPriceMax=0,LotB=0,LotS=0,op,lt;
   int    b=0,s=0;                         // Каждый тик обнуляемся и имеем текущую ситуацию

   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
              {
               op = NormalizeDouble(OrderOpenPrice(),Digits());
               lt = NormalizeDouble(OrderLots(),2);
               
               if(OrderType()==OP_BUY)
                 {
                  b++;                     // Количество BUY ордеров
                  LotB=LotB+lt;            // Сумма всех BUY лотов
                   if(op<BuyPriceMin || BuyPriceMin==0)
                      BuyPriceMin    = op; // Цена открытия самого низкого ордера Buy
                  }
               // ===
               if(OrderType()==OP_SELL)
                 {
                  s++;                     // Количество SELL ордеров
                  LotS=LotS+lt;            // Сумма всех SELL лотов
                  if(op>SelPriceMax || SelPriceMax==0)
                      SelPriceMax    = op; // Цена открытия самого высокого ордера Sell
                  }
              }       // Из-за проскальзывания диапазон будет сужаться в реале
//*************************************************************// Рассчитываем и проверяем лот
         double BuyLot=0,SelLot=0;                  //Следующие лоты на открытие
         
         if(b+s==0)                                 // Если нет ордеров 
           {
           BuyLot=StartLots; 
           SelLot=StartLots;
           }
         //--- 
         if(s>0)                                    // Если есть ордера Sell 
           BuyLot=NormalizeDouble((LotS*2-LotB),2); // Лотов Buy должно быть в 2 раза больше, чем Sell
         //---
         if(b>0)                                    // Если есть ордера Buy  
           SelLot=NormalizeDouble((LotB*2-LotS),2); // Лотов Sell должно быть в 2 раза больше, чем Buy
         //-------- Проверяем на превышение и корректность--------------------------------------------
         if(BuyLot>MaximalLots)      BuyLot=MaximalLots;
         if(SelLot>MaximalLots)      SelLot=MaximalLots;
         if(!CheckVolumeValue(BuyLot) || !CheckVolumeValue(SelLot)) return;
         
//*****************************************************// Открываем ордера
      if(b+s==0 && Signal() == OP_BUY)                 // Первый ордер открываем по сигналу Buy или Sell
        {
        int ticket = OrderSend(Symbol(),OP_BUY,BuyLot,Ask,Slippage,0,0," ",MagicNumber,0,clrBlue);
        
        if(ticket<0)
          Print("OrderSend error #",GetLastError());
             else PlaceStopTakeProfit(ticket, OP_BUY, Ask);  // ставим стопы после открытия
             }
      //---
      if(s+b==0 && Signal() == OP_SELL)
        {
        int ticket = OrderSend(Symbol(),OP_SELL,SelLot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed);
         if(ticket<0)
            Print("OrderSend error #",GetLastError());
             else PlaceStopTakeProfit(ticket, OP_SELL, Bid); // ставим стопы после открытия
             }
      //------------------------------------------------// Открываем следующий ордер защиты канала// не открывает падла и нет ошибок????????????????????
      double step =NormalizeDouble( OrderStep*Point,Digits);

      if(s>0 && Ask >= SelPriceMax+step && LotB!=0)     // Если есть продажи и дошли до покупки (она выше продаж)
        {                                               // Если лотов на уровне комплект (*2), то LotB=0
        int ticket=OrderSend(Symbol(),OP_BUY,BuyLot,Ask,Slippage,0,0," ",MagicNumber,0,clrBlue);
        if(ticket<0)
          Print("OrderSend error #",GetLastError());
             else PlaceStopTakeProfit(ticket, OP_BUY, Ask);  // ставим стопы после открытия
             }
      //---
      if(b>0 && Bid <= BuyPriceMin-step && LotS!=0)     // Если есть покупки и дошли до продажи (она ниже покупки)
        {                                               // Если лотов на уровне комплект (*2), то LotS=0
        int ticket = OrderSend(Symbol(),OP_SELL,SelLot,Bid,Slippage,0,0," ",MagicNumber,0,clrRed);
         if(ticket<0)
            Print("OrderSend error #",GetLastError());
             else PlaceStopTakeProfit(ticket, OP_SELL, Bid); // ставим стопы после открытия
             }
//******************************************************//Модернизация в цикле SL и ТР//Эта не работает (???????????????), да и хрен с ней, хотя и обидно 
/*   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
              {
               op = OrderOpenPrice();
               tk = OrderTicket();
               sl = OrderStep*1.3*Point;
               tp = OrderStep*2*Point;

               if(OrderType()==OP_BUY && tp==0)
                  if(!OrderModify(tk,op,NormalizeDouble(op-sl,Digits()),NormalizeDouble(op+tp,Digits()),0,clrBlue))
                     Print("OrderModify error #",GetLastError());

               if(OrderType()==OP_SELL && tp==0)
                  if(!OrderModify(tk,op,NormalizeDouble(op+sl,Digits()),NormalizeDouble(op-tp,Digits()),0,clrRed))
                     Print("OrderModify error #",GetLastError());
              }*/
}
//************************************************************************************************/
      

//************************************************************************************************/
//*                                                                                              */
//************************************************************************************************/
void OnDeinit(const int reason)
{

}
//************************************************************************************************/
//*                            ПРОВЕРКИ                                                          */
//************************************************************************************************/
bool CheckVolumeValue(double volume)
{
//--- минимально допустимый объем для торговых операций
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
      if(volume<min_volume)
         return(false);
//--- максимально допустимый объем для торговых операций
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
      if(volume>max_volume)
         return(false);
//--- получим минимальную градацию объема
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
   int ratio=(int)MathRound(volume/volume_step);
      if(MathAbs(ratio*volume_step-volume)>0.0000001)
         return(false);
   return(true);
}
//---------------------------------------------------------------   
void PlaceStopTakeProfit(int ticket, int dir, double op) // установка стопов и профитов 
{
        int i=5;                // Число попыток
        while (i>0)
          {
          RefreshRates();
          double sl=NSL(dir, op), tp=NTP(dir, op);
          
          if (OrderModify(ticket, op, sl, tp, 0)) 
            break;    // Выходим из while - ордер модернизировали, а иначе
          Print("OrderModify #"+string(ticket)+"  error "+string(GetLastError())); 
          Sleep(100); // ждем секунду 
          i--;        // и продолжаем 5 раз
          }
}
//---------------------------------------------------------------   
double NSL(int dir, double op) // Нормализация цены SL
{
        double StopLvl=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point;
        double pr=NP((dir==OP_BUY)?Bid:Ask);
        double sl=ND(OrderStep*Point*1.3,-1);           // Планирую с этого уровня трал прибыльных ордеров
        
        if (dir==OP_BUY) 
          { 
          sl=op-sl; 
          return NP(MathMin(sl, pr-StopLvl)); 
          }
        if (dir==OP_SELL) 
          { 
          sl=op+sl; 
          return NP(MathMax(sl, pr+StopLvl)); 
          }
        return 0;
}
//---------------------------------------------------------------   
double NTP(int dir, double op) // Нормализация цены TP
{
        double StopLvl=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point;
        double pr=NP((dir==OP_BUY)?Bid:Ask);
        double tp=ND(OrderStep*Point*2,-1);
        
        if (dir==OP_BUY) 
          { 
          tp=op+tp; 
          return NP(MathMax(tp, pr+StopLvl)); 
          }
        if (dir==OP_SELL) 
          { 
          tp=op-tp; 
          return NP(MathMin(tp, pr-StopLvl)); 
          }
        return 0;
}
//---------------------------------------------------------------   
double ND(double d, int n=-1) 
{ 
  if (n<0) 
    return NormalizeDouble(d, Digits); 
  return NormalizeDouble(d, n); 
}
//---------------------------------------------------------------   
double NP(double d) 
{
  double TickSize=MarketInfo(Symbol(), MODE_TICKSIZE); 
  if (TickSize==0) 
    TickSize=1; 
  return ND(MathRound(d/TickSize)*TickSize); 
}
//************************************************************************************************/
int Signal()                   // Создаем функцию получения сигнала на указанном ТФ и баре
{
        int    iB = 1;
        double Mash = iMA(NULL,0,Per_MA,0,0,4,iB) ;
        double Atr  = 0.2 * iATR(NULL,TF_ATR,Per_MA,iB);
        double Sell = 0;
        double Buy  = 0;
         
        if (Atr!=0)
          {
          Sell = 3.0 * (High[iB]  - Mash) / Atr;
          Buy  = 3.0 * (Low[iB]   - Mash) / Atr;
          }
          if (Sell >=  Level_Up) 
            return OP_SELL;
          
          if (Buy <= -Level_Dn) 
            return OP_BUY;
      return (-1);    // Иначе - НЕТ СИГНАЛА
}
//************************************************************************************************
Файлы:
 
kvashnin007:

Что пишет вы логах - журнал ошибок, возможно при открытии какой - то параметр криво передаете (его значение) или в условие перед входом на открытие никогда прога не заходит. Принтуйте участки кода по тексту - смотрите куда доходите и какие значения у параметров для открытия позиции. Или воспользуйтесь трассировкой кода. Например, может первый ордер при открытии у вас имеет значение "0", а именно

BuyLot

проверьте принтом перед открытием позиции рыночной его значение.

вОТ ПОДобная усреднялка - разберите и у себя по аналогии отобразите и все: 

 if (RSI0>=level_buy && RSI1<=level_buy)
   {
      if ((MinOrderBuy-MinStep*Point>Ask || MinOrderBuy==0))
      {
         Lots=NormalizeDouble(Lot*MathPow(K_Lot,b),DigitsLot);

         if (Lots>MAXLOT) Lots = MAXLOT;
         if (Lots<MINLOT) Lots = MINLOT;
      
         if (OrderSend(Symbol(),OP_BUY, Lots,NormalizeDouble(Ask,Digits),slippage,0,0,NULL,Magic,0,CLR_NONE)==-1)
            Print("Ошибка ",GetLastError()," открытия ордера ");
         else TimeBar=iTime(NULL,timeframe_RSI,0);
      }
Усредняющий советник по индикатору RSI
Усредняющий советник по индикатору RSI
  • www.mql5.com
Советник открывает ордера по сигналам индикатора RSI с усреднением.
 
Roman Shiredchenko #:

Что пишет вы логах - журнал ошибок, возможно при открытии какой - то параметр криво передаете (его значение) или в условие перед входом на открытие никогда прога не заходит. Принтуйте участки кода по тексту - смотрите куда доходите и какие значения у параметров для открытия позиции. Или воспользуйтесь трассировкой кода. Например, может первый ордер при открытии у вас имеет значение "0", а именно

проверьте принтом перед открытием позиции рыночной его значение.

вОТ ПОДобная усреднялка - разберите и у себя по аналогии отобразите и все: 

Роман, здавствуйте. Спасибо, что откликнулись. Пробовал разные варианты. Логи не вызывают подозрений.

Файлы:
20220310.log  6 kb
 
Roman Shiredchenko #:

Что пишет вы логах - журнал ошибок, возможно при открытии какой - то параметр криво передаете (его значение) или в условие перед входом на открытие никогда прога не заходит. Принтуйте участки кода по тексту - смотрите куда доходите и какие значения у параметров для открытия позиции. Или воспользуйтесь трассировкой кода. Например, может первый ордер при открытии у вас имеет значение "0", а именно

проверьте принтом перед открытием позиции рыночной его значение.

вОТ ПОДобная усреднялка - разберите и у себя по аналогии отобразите и все: 

На счет усреднялки. ***. Я таких написал две. Одну сам, другую с помощью. Да результат дают, но слить могут в любой момент.  А идея была хорошей - оставь WPR с периодом, скажем, 365 и торгуйте в диапазоне от 0 до 100. А что?.. удобно. Советник зарабатывает тысячи процентов за месяц, а слить может при депо100000 и лоте 0.01. Кстати его украли с Fozy, доработали (скажем, хорошо) и пустили в свободное плавание. Какая-то там ЗЕБРА. Не помню точно. Не суть. Прокололся я сейчас там, где точно не рассчитывал. И  остановился. Хочу развить чужую идею "защиты ценового канала". Есть мысли как значительно снизить лотность без потери идеи, но..  Математика  с риском==0. А я не волшебник, а только учусь.
 
kvashnin007 #:
Пишу советник. Ничего нового пока. Нужна помощь профи. Не открываются ордера.

Проверил, советник торгует, за 2 года теста 2600 сделок.


 
FXwin #:

Проверил, советник торгует, за 2 года теста 2600 сделок.


Добрый день. Советник открывает только стартовые сделки. С лотами не работает дальше Дальше лот вычисляется <=0. Пока стартовый, например buy, не закроется по тейку или стопу, новый на buy, опять же не откроется Ордера Buy-sell здесь не зависимы друг от друга. Стратегия не выполняется. Я дал тот же советник с комментариями. Гляньте. Может увидите, где пЛОХ.

Файлы:
 
FXwin #:

Проверил, советник торгует, за 2 года теста 2600 сделок.


Решил пооптимизировать. Вообще смешная картинка получилась. Но дело не в том  Этот нерабочий советник может тоже давать положительный результат. А если вовремя остановиться, то можно ехать на Майами. Но задача в другом. Разработал математическую модель с нулевым риском. Базовая идея не моя. Но ее бросили, как стремную. Слить может. Не хватит депо и тю-тю. Я построил чисто математическую стратегию, как уйти от просадок. Это же не весь советник. Денег заплатить спецу нет. вот и начал писать сам. Да и отчаянная попытка дать денег "спецу", увенчалась потерей этих денег. Вот и застопорился в самом начале.  Видать, прогуливал учебу. Вроде все по фэншую, а не работает. Обидно другое. Не могу понять, где я пЛОХ. Моя стратегия, скорее всего, нуждается в составлении таблиц. Для меня это пока недостижимо. Лет через много, когда мой внук спросит, а что такое биржа, деда?.. я таки освою таблицы, а пока решил написать сокращенный вариант. С бОльшей просадкой и меньшей доходностью.

Да к стати. У меня ниразу не получался график с подобными пейзажами. Если Вам не трудно, не могли бы сбросить мне не график а результаты торговли. Думаю, там много интересного. И терминалом какого брокера Вы пользуетесь?

 
kvashnin007 #:

Решил пооптимизировать. Вообще смешная картинка получилась. Но дело не в том  Этот нерабочий советник может тоже давать положительный результат. А если вовремя остановиться, то можно ехать на Майами. Но задача в другом. Разработал математическую модель с нулевым риском. Базовая идея не моя. Но ее бросили, как стремную. Слить может. Не хватит депо и тю-тю. Я построил чисто математическую стратегию, как уйти от просадок. Это же не весь советник. Денег заплатить спецу нет. вот и начал писать сам. Да и отчаянная попытка дать денег "спецу", увенчалась потерей этих денег. Вот и застопорился в самом начале.  Видать, прогуливал учебу. Вроде все по фэншую, а не работает. Обидно другое. Не могу понять, где я пЛОХ. Моя стратегия, скорее всего, нуждается в составлении таблиц. Для меня это пока недостижимо. Лет через много, когда мой внук спросит, а что такое биржа, деда?.. я таки освою таблицы, а пока решил написать сокращенный вариант. С бОльшей просадкой и меньшей доходностью.

Вы правильно заметили, что есть советники, имеющие четко выраженные и достаточно длинные периоды торговли в плюс и в минус. Такие советники легко приучить торговать в плюс. Самый простейший из используемых мной способов такой: Советник изначально торгует лотом 0,01. Если предыдущий ордер закрылся с прибылью, лот увеличивается до 0,5. Если убыток - снова 0,01. Это простейшая модель. Делал более сложно: Один советник на демо, второй на реале. Если на демо прибыль, начинает торговать советник на реале до первого убытка. Еще более сложная модель советник вычисляет результат торговли. Если получается прибыль, начинает торговлю. После убытка прекращает и дальне просто вычисляет.

Еще один способ при использовании сигналов. Есть сигналы, которые давно торгуют и в среднем прибыльно, но есть периоды просадки. Использование таких сигналов можно сделать значительно прибыльнее. Для этого надо отслеживать начало просадки и отключаться от сигнала. А когда сигнал уйдет в просадку и начнет из нее выходить - подключаться. Сигнал из просадки выйдет в ноль, а у нас с нуля уйдет в прибыль. Этот же способ годится и для управления роботом с переменной прибыльностью.

В любом случае надо и роботов писать, и системы управления ими.

 
a007 #:

Вы правильно заметили, что есть советники, имеющие четко выраженные и достаточно длинные периоды торговли в плюс и в минус. Такие советники легко приучить торговать в плюс. Самый простейший из используемых мной способов такой: Советник изначально торгует лотом 0,01. Если предыдущий ордер закрылся с прибылью, лот увеличивается до 0,5. Если убыток - снова 0,01. Это простейшая модель. Делал более сложно: Один советник на демо, второй на реале. Если на демо прибыль, начинает торговать советник на реале до первого убытка. Еще более сложная модель советник вычисляет результат торговли. Если получается прибыль, начинает торговлю. После убытка прекращает и дальне просто вычисляет.

Еще один способ при использовании сигналов. Есть сигналы, которые давно торгуют и в среднем прибыльно, но есть периоды просадки. Использование таких сигналов можно сделать значительно прибыльнее. Для этого надо отслеживать начало просадки и отключаться от сигнала. А когда сигнал уйдет в просадку и начнет из нее выходить - подключаться. Сигнал из просадки выйдет в ноль, а у нас с нуля уйдет в прибыль. Этот же способ годится и для управления роботом с переменной прибыльностью.

В любом случае надо и роботов писать, и системы управления ими.

Вечер добрый. Не знаю, как обращаться, но все равно спасибо за реакцию. 

Я давно изучаю варианты.  Скинул один из многих вариантов (разруливание, разгон, сеты, грааль и т.п.), но они практически бесполезны в смысле : зарабатывай и спи спокойно. То, о чем Вы говорите, имеет право на бытие. Хотя есть вещи, с которыми я не совсем согласен. Была у меня схема, типа искусственного интеллекта, но это не для меня. Предлагал одному продвинутому взять на вооружение, но... или слишком сложно, или не охота заморачиваться. Систему потянул бы только отдельный сервер, но выдавал бы рейтинговые сигналы. Чем дольше бы работал, тем точнее сигналы.

Опять же, я отошел от построения всевозможных схем. Хотя осталась одна невоплощенная, где рисковали малым, чтобы получить большее. При 10-ти отрицательных входах  (что, в прицепе, тоже возможно) теряли бы 10% дэпо, но если попадали в струю, имели бы лавинный прирост. Но советник даже с помощью со стороны не заработал. В смысле вообще. Но даже эта схема, для меня является рискованной. Поэтому я разработал мат. модель безрисковой торговли, а навыков перевести все это в код не хватает. Вот и обратился за помощью, надеюсь, спецов. Идея модели в том, что мы постоянно страхуемся полученной прибылью. Здесь выложен не советник, а его малая часть. Да и просадку сами задаем. Таблицы расчетов остались где-то в глубине вымершего ноутбука. При просадке 8% (не исключалась разовая 16%) 137% годовых. При просадке в два раза больше, прибыль достигала более 500%. Сейчас точнее не помню ибо рассчитывал на меньшую просадку. Люблю спать спокойно.

Файлы:
y3chl0ohy1rf.zip  1368 kb
 
Такое впечатление, что это блог для пиарщиков. Подозреваю, что тем, кто хоть что-то ляпнет клавиатурой... А если еще картинку, не дай бог, прилепит... Тому счастье и почет. Блин, до чего опустилась хайповая молодежь. Где же нормальных то людей найти? Я молчу про специалистов. Всем здоровья.
 
kvashnin007 #:

Вечер добрый. Не знаю, как обращаться, но все равно спасибо за реакцию. 

Я давно изучаю варианты.  Скинул один из многих вариантов (разруливание, разгон, сеты, грааль и т.п.), но они практически бесполезны в смысле : зарабатывай и спи спокойно. То, о чем Вы говорите, имеет право на бытие. Хотя есть вещи, с которыми я не совсем согласен. Была у меня схема, типа искусственного интеллекта, но это не для меня. Предлагал одному продвинутому взять на вооружение, но... или слишком сложно, или не охота заморачиваться. Систему потянул бы только отдельный сервер, но выдавал бы рейтинговые сигналы. Чем дольше бы работал, тем точнее сигналы.

Опять же, я отошел от построения всевозможных схем. Хотя осталась одна невоплощенная, где рисковали малым, чтобы получить большее. При 10-ти отрицательных входах  (что, в прицепе, тоже возможно) теряли бы 10% дэпо, но если попадали в струю, имели бы лавинный прирост. Но советник даже с помощью со стороны не заработал. В смысле вообще. Но даже эта схема, для меня является рискованной. Поэтому я разработал мат. модель безрисковой торговли, а навыков перевести все это в код не хватает. Вот и обратился за помощью, надеюсь, спецов. Идея модели в том, что мы постоянно страхуемся полученной прибылью. Здесь выложен не советник, а его малая часть. Да и просадку сами задаем. Таблицы расчетов остались где-то в глубине вымершего ноутбука. При просадке 8% (не исключалась разовая 16%) 137% годовых. При просадке в два раза больше, прибыль достигала более 500%. Сейчас точнее не помню ибо рассчитывал на меньшую просадку. Люблю спать спокойно.

Посмотрел картинки Вашего архива. Ну что сказать? Слона можно увидеть целиком, а съесть только маленькими кусочками. А на это надо время. Как понял, Вы предпочитаете заниматься теорией вместо практического заработка. Меня тоже торговля мало интересует, я фанат программирования. Но на демо запускаю разработки на основе своих и чужих идей. Пример прилагаю.

Сейчас изучаю среди прочего построение грааля на основе разруливания локов.

Файлы:
Stelz-1.JPG  207 kb