Помогите с советником

 

Добрый день, столкнулся с проблемой

  

При привязки к буферам данного индикатора советник открывает постоянно ордера, а надо что бы на один сигнал индикатора советник открыл одну сделку. Код индикатора к сожалению закрыт, работать могу только с его буферами.

Стрелка индикатора появляется на предыдущем баре и не перерисовывается

 

Вот код советника


//+------------------------------------------------------------------+
//|                                                     TrendBot.mq4 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//++++++++++++++++++++++++++++++++++++++
//+++++++++  Настройки    ++++++++++++++
//++++++++++++++++++++++++++++++++++++++
extern string p2 = "НАСТРОЙКА СОВЕТНИКА"; 
extern double Lot =0.01;//Лот
extern int Magic = 12345;//Магический номер 
extern string p3 = "Все параметры ниже в ПИПСАХ!"; 
extern int Slippage = 50;//Проскальзывание
extern int TakeProfit = 500;//TakeProfit
extern int StopLoss = 500;//StopLoss
extern string p1 = "НАСТРОЙКА ИНДИКАТОРА"; 
extern bool show_Reversal_Points = false;//Показывать уровни
extern bool show_Bar_time = true;//Показывать время до конца свечи
extern bool show_Alert = true;//Присылать алерты

//Настройки в хайде
string name = "";//Название робота
int expiration = 0;//Срок истечения ордера
color buycolor = clrGreen;//Цвет ордера buy
color sellcolor = clrRed;//Цвет ордера sell
//--------------------------------------------------------------------------------------------------------


//#########################################################################################################################################################
//++++++++++++++++++++++++++++++++++++++++++++++++++++++       НАЧАЛО РАБОТЫ СОВЕТИНКА    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//#########################################################################################################################################################

double sell,buy;

void OnTick()
{
//#######################################################
//#############    Привязка индикатора   ################
//#######################################################
   iCustom(Symbol(),0,"TRADE MASTER PRO V2",show_Reversal_Points,show_Bar_time,show_Alert,0,0);
   iCustom(Symbol(),0,"TRADE MASTER PRO V2",show_Reversal_Points,show_Bar_time,show_Alert,1,0);
   iCustom(Symbol(),0,"TRADE MASTER PRO V2",show_Reversal_Points,show_Bar_time,show_Alert,2,0);
   iCustom(Symbol(),0,"TRADE MASTER PRO V2",show_Reversal_Points,show_Bar_time,show_Alert,3,0);
   buy=iCustom(Symbol(),0,"TRADE MASTER PRO V2",show_Reversal_Points,show_Bar_time,show_Alert,4,0);
   sell=iCustom(Symbol(),0,"TRADE MASTER PRO V2",show_Reversal_Points,show_Bar_time,show_Alert,5,0);
//--------------------------------------------------------------------------------------------------------

//#######################################################
//#######    Проверка лимита и открытие ордера   ########
//#######################################################
int limitbuy = 0;
int limitsell = 0;
//++++++++++++++++++++++++++++++++++++++
//++++++   Открытие сделки BUY    ++++++
//++++++++++++++++++++++++++++++++++++++
   
   if(CountOrders() == 0 && limitbuy == 0 && buy > 0)
   {
      if ()
      {
         int ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0,name,Magic,expiration,buycolor);
         if (ticket > 0) limitbuy++;
      }   
   }
//++++++++++++++++++++++++++++++++++++++
//++++++   Открытие сделки SELL    +++++
//++++++++++++++++++++++++++++++++++++++
   if(CountOrders() == 0 && limitsell == 0 && sell > 0)
   {
      int ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0,name,Magic,expiration,sellcolor);
      if (ticket > 0) limitsell++;
   }

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++   Установка тейка и стопа если они указыны    +++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   if (CountOrders() > 0 && TakeProfit != 0 || StopLoss != 0) Modify();
   

//--------------------------------------------------------------------------------------------------------
}

//#######################################################
//#############  Вспомогательные функции ################
//#######################################################

//+------------------------------------------------------------------+ 
//++++++++++++++++++      Считаем все ордера        ++++++++++++++++++
//+------------------------------------------------------------------+
int CountOrders()
{
   int orders = 0;
   for(int i=OrdersTotal()-1;i>=0;i--)
   {
      if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if (OrderType() == OP_BUY || OrderType() == OP_SELL) //Подсчет всех ордеров в рынке
            orders++; 
         }
      }
   }
   return(orders);
}

//+------------------------------------------------------------------+ 
//++++++++++++++++++      Модификация ордеров      ++++++++++++++++++
//+------------------------------------------------------------------+
int Modify()
{
double tp,st;
   for(int i=OrdersTotal()-1;i>=0;i--)
   {
      if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if (OrderType() == OP_BUY)
            {
               if (TakeProfit == 0) tp = 0;
               else if (TakeProfit != 0) tp = OrderOpenPrice()+TakeProfit*Point;
               if (StopLoss == 0)   st = 0;
               else if (StopLoss != 0)   st = OrderOpenPrice()-StopLoss*Point;
               if (tp > 0 || st > 0) OrderModify(OrderTicket(),OrderOpenPrice(),st,tp,expiration,buycolor);
            }
            else if (OrderType() == OP_SELL)
            {
               if (TakeProfit == 0) tp = 0;
               else if (TakeProfit != 0) tp = OrderOpenPrice()-TakeProfit*Point;
               if (StopLoss == 0)   st = 0;
               else if (StopLoss != 0)   st = OrderOpenPrice()+StopLoss*Point;
               if (tp > 0 || st > 0) OrderModify(OrderTicket(),OrderOpenPrice(),st,tp,expiration,sellcolor);
            }
         }
      }
   }
  return(tp);
  return(st);    
}
 

это нарезка или всё ?

в любом случае:

* торговля очевидно по барам, но нет функции ф-ля OnBar или блока "новый бар" - каждый тик почти одно и то-же

* ордера должны открываться всегда когда buy>0 или когда с 0 поменялся на + ? обычно используют триггерные значения

* в любом случае - limitbuy, limitsell роли не играют, они у вас почему-то локальные и всегда 0

* в CountOrders не проверяется результат OrderSelect 

и дополнительно проверьте - тот ли буфер индикатора вы берёте

мелкие недочёты: цены в Modify надо нормализовать.

PS/ если тикетов всего по логике 1, то отчего не запоминаете его в своих переменных ? нафига вообще CountOrders..

 
Maxim Kuznetsov #:

это нарезка или всё ?

в любом случае:

* торговля очевидно по барам, но нет функции ф-ля OnBar или блока "новый бар" - каждый тик почти одно и то-же

* ордера должны открываться всегда когда buy>0 или когда с 0 поменялся на + ? обычно используют триггерные значения

* в любом случае - limitbuy, limitsell роли не играют, они у вас почему-то локальные и всегда 0

* в CountOrders не проверяется результат OrderSelect 

и дополнительно проверьте - тот ли буфер индикатора вы берёте

мелкие недочёты: цены в Modify надо нормализовать.

PS/ если тикетов всего по логике 1, то отчего не запоминаете его в своих переменных ? нафига вообще CountOrders..

Да это полный код решил дальше не писать пока ошибку не исправлю с открытием.

Не подскажите что за функция должна быть для баров?

Ордера открываются при появлении новой стрелки (buy > 0 я использовал как условие для входа)

Да буферы берутся верно

 

Второе и третье условие в скобки надо заключить

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++   Установка тейка и стопа если они указыны    +++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   if (CountOrders() > 0 && (TakeProfit != 0 || StopLoss != 0)) Modify();
Причина обращения: