Доработка ботов (советников, индикаторов) vol. 2

mobidik

-----
Здравствуйте. Помогите пожалуйста, уже долго бьюсь над одним вопросом. Есть 4 индикатора WPR с разными параметрами и когда они сходятся в нижней границе они дают сигнал на покупку и их может быть несколько. Нужно чтобы ордер открывался на каждом сигнале . А у меня получается только одна сделка. Что нужно подправить в коде, чтобы это исправить?
На рис показано: В - открытие сделок, 1 - одно закрытие всех сделок.

Код:
for(i=OrdersTotal(); i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderMagicNumber()==Magic || OrderSymbol()==Symbol())
              {
               if(OrderType()==OP_BUY)
                  pos++;
               if(OrderType()==OP_SELL)
                  pos++;
              }
           }

         double wpr21 = iWPR(Symbol(),0,21,0);
         double wpr55 = iWPR(Symbol(),0,55,0);
         double wpr77 = iWPR(Symbol(),0,77,0);
         double wpr277 = iWPR(Symbol(),0,277,0);

         if(wpr21>Vverh && wpr55>Vverh  && wpr77>Vverh  && wpr277>Vverh)
           {
            RefreshRates();

            if(StopLoss>0)
               sl=NormalizeDouble(Bid+StopLoss*Point,Digits);
            if(TakeProfit>0)
               tp=NormalizeDouble(Bid-TakeProfit*Point,Digits);

            ticket = OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,sl,tp,"",Magic,0,Red);
            Alert("Открылась сделка на Sell");
            if(ticket<0)
              {
               Print("Позиция Sell не открылась, ошибка: ",GetLastError());
               return;
              }
           }
         if(wpr21<Vniz && wpr55<Vniz  && wpr77<Vniz  && wpr277<Vniz)
           {
            RefreshRates();

            if(StopLoss>0)
               sl=NormalizeDouble(Ask-StopLoss*Point,Digits);
            if(TakeProfit>0)
               tp=NormalizeDouble(Ask+TakeProfit*Point,Digits);

            ticket = OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,sl,tp,"",Magic,0,Blue);
            Alert("Открылась сделка на Buy");
            if(ticket<0)
              {
               Print("Позиция Buy не открылась, ошибка: ",GetLastError());
               return;
              }
           }
        }
Соглашусь с Владом, в данной части кода все верно.
Переменная pos объявлена выше по коду, предполагаю, что есть еще условие с её использованием, если да - нужно править его. Следовало бы добавить: как только совпали условия и удачно установилась позиция - запомнить время бара, да бы больше не устанавливать позиций на этом же баре. При следующем сигнале сравнить текущие время с временем установки последнего сигнала - если они разные - можем поставить новую позицию по новому сигналу и так далее. При этом, можно использовать переменную pos на ограничение макс. количества позиций в рынке, как вариант.
 

vladradon

Программист
Нужно чтобы ордер открывался на каждом сигнале .
Извиняюсь - не посчитал скобки - в оригинале весь цикл работает на открытие ордеров - последнюю скобку нужно перенести на закрытие цикла.
C#:
   for(i=OrdersTotal(); i>=0; i--)
       {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderMagicNumber()==Magic || OrderSymbol()==Symbol())
              {
               if(OrderType()==OP_BUY)
                  pos++;
               if(OrderType()==OP_SELL)
                  pos++;
              }
           }
       }

         double wpr21 = iWPR(Symbol(),0,21,0);
         double wpr55 = iWPR(Symbol(),0,55,0);
         double wpr77 = iWPR(Symbol(),0,77,0);
         double wpr277 = iWPR(Symbol(),0,277,0);

         if(wpr21>Vverh && wpr55>Vverh  && wpr77>Vverh  && wpr277>Vverh)
           {
            RefreshRates();

            if(StopLoss>0)
               sl=NormalizeDouble(Bid+StopLoss*Point,Digits);
            if(TakeProfit>0)
               tp=NormalizeDouble(Bid-TakeProfit*Point,Digits);

            ticket = OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,sl,tp,"",Magic,0,Red);
            Alert("Открылась сделка на Sell");
            if(ticket<0)
              {
               Print("Позиция Sell не открылась, ошибка: ",GetLastError());
               return;
              }
           }
         if(wpr21<Vniz && wpr55<Vniz  && wpr77<Vniz  && wpr277<Vniz)
           {
            RefreshRates();

            if(StopLoss>0)
               sl=NormalizeDouble(Ask-StopLoss*Point,Digits);
            if(TakeProfit>0)
               tp=NormalizeDouble(Ask+TakeProfit*Point,Digits);

            ticket = OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,sl,tp,"",Magic,0,Blue);
            Alert("Открылась сделка на Buy");
            if(ticket<0)
              {
               Print("Позиция Buy не открылась, ошибка: ",GetLastError());
               return;
              }
           }
 

ale9551

Активный участник
Извиняюсь,но выбор направлению торговли прошу оставить(1-торгуем в СЕЛЛ,0-торгуем талько в БАЙ),думал применять в настройках советника Long only и Short only,но тогда советник будет работать некорректно.
Также прикрепляю Moving Average
Уважаемые программисты!
Обратите пожалуйста внимание на мой пост и предыдущий!
 

Anna89

Новичок форума
Можете подсказать еще один момент? Как прописать, чтобы с первым ордером выставлялся тейкпрофит, а послевторого и последующих ордеров тейкпрофит ставился с дополнительным расстоянием ? Т.е. значение ТР+50 пунктов, к примеру. Т.е. к каждому ордеру ставился свой тр.
 

AlexeNP

Гуру форума
Можете подсказать еще один момент? Как прописать, чтобы с первым ордером выставлялся тейкпрофит, а послевторого и последующих ордеров тейкпрофит ставился с дополнительным расстоянием ? Т.е. значение ТР+50 пунктов, к примеру. Т.е. к каждому ордеру ставился свой тр.
самый легкий путь - сосчитать сколько открытых ордеров и по этому количеству прибавлять
как пример
pos=0;
for(i=OrdersTotal(); i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY)
pos++;
}
}
TP = TP0 + pos*step;
 

Anna89

Новичок форума
самый легкий путь - сосчитать сколько открытых ордеров и по этому количеству прибавлять
как пример
pos=0;
for(i=OrdersTotal(); i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY)
pos++;
}
}
TP = TP0 + pos*step;
Спасибо за подсказку
 

Slava78

Элитный участник
Вы не могли бы добавить функцию для EA_Better.mq4 , чтобы можно было регулировать количество сделок за день? Например, чтобы можно было открыть только одну сделку в день? Пожааалуйста! 🙂
Пока не получается. Делал сову просто так, проверить ТС. Попробуй увеличить ТФ, поможет
 

AlexeNP

Гуру форума
Спасибо за подсказку
реально, (ты же пишешь экспертов для реального применения?) лучше вместо пунктов сразу переходи на размер спреда... сейчас плавающий спред норма, а не исключение. Поэтому 50 и 100 пунктов могут оказаться вообще ни о чем - одни убытки)
плюс ко всему - установка тейк-профита и стоп-лосса не такое уж легкое мероприятие, как мне казалось вначале - вот, допустим твой робот по своим показателям должен показывать положительные показатели по вероятности сделок, количеству выигранных пунктов и прибыли... тут есть где разгуляться пытливому уму)
 

sergeikip2008

Активный участник
День добрый уважаемые форумчане...да можно попросить вас сделать в советнике независимое отключение индикаторов, т.е. когда один допустим отключен. два других работают...
С, уважением. Сергей...
 

Вложения

  • тестер2.mq4
    37 КБ · Просмотры: 39

ale9551

Активный участник
Уважаемые программисты!
Доработайте пожалуйста советник.
В оригинале советник Martin открывает сделки,в зависимости от выбранного направления(1-только селл,0-только бай),после сработки тейка или стоп лосса,следующая позиция сразу же открывается лотом,умноженным на KLot от предыдущего.(Если StopTake=0,то после СЛ,если StopTake=1,то после ТП)
Мне необходимо следущее:
1)Советник должен открывать позиции,в соответствии с встроенным в терминал индикатором МА(соответственно нужно добавить настройки МА в бот,)
2)Сделки советник должен открывать(строго на открытии нового бара,а не сразу после закрытия предыдущей позиции),если цена ниже МА,то советник открывает сделку в БАЙ,если выше МА,то в СЕЛЛ!
Если закрылись в профит,то сл сделка открывается предыдущим лотом,если закрылись в лосс,то сл сделка открывается с умножением КLot.Если StopTake=1,то наоборот умножаем лот после профита!
Заранее благодарен!
 

Вложения

  • Martin.mq4
    3,7 КБ · Просмотры: 14
  • moving_averages.mq4
    5,3 КБ · Просмотры: 18
Последнее редактирование:

Humper0080

Интересующийся
[QUOTE = "Humper0080, post: 1507759, member: 176106"]
Hello programmers

Could you the make the this Requirement.

'The EA's checks the Account History of Symbol attached for Loss / Profit

And Uses Current Live Lots to the Compute the Breakeven Value

Have Input TP From Breakeven in Pips to close the Orders and Delete Pending Orders

Thank You Very Much


Also Have a Display for Breakeven Line and Value
[/ QUOTE]

Hello Anybody Can Help Me

Thank You
 

AlexeNP

Гуру форума
Я тоже хотел бы это узнать, я не прогер, я только учусь
ну, лучше всего лот рассчитывать примерно так:
Код:
   double min_lot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   double max_lot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   double step_lot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
   int step=(int)((lot-min_lot)/step_lot);
   if(step<0)
     {
      step=0;
     }
   double cur_lot=min_lot+step*step_lot;
   if(cur_lot>max_lot)
     {
      cur_lot=max_lot;
     }
ну и после этого конечно же проверить достаточно ли средств для открытия позиции
AccountFreeMarginCheck(Symbol(),type_order,cur_lot)
 
Верх