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

 
alexey1979621:
Спасибо, разобрал Ваш код. Ошибка на открытие действительно есть (глаз уже замылился). Поставил переделанный советник на демку, где уже открыты позиции по нашему Мейджику с суммарным положительным профитом. Однако, позиция не закрылась.

Я смотрю в новом коде (который ниже в посте) поменялся параметр по умолчанию, передаваемый в функцию:

int NumberOfPositions(string sy="", int op=-1, int mn=1114)

В первоначальном варианте был другой Магик. Я исправил в своём коде обращение к этой функции. Посмотрите под каким Магиком открыты сейчас ордера и поставьте в советнике этот номер Магика.

P.S. И использовать при наименовании переменных разные кодировки не есть признак хорощего тона... Я про:

extern string Сomment           = "KVAZ_EURUSD_GBPUSD";
 
Roger:


Глянь на эту строку

else if (order_type = OP_SELL()

И эту

if (order_type = OP_BUY)
 
TarasBY:

Я смотрю в новом коде (который ниже в посте) поменялся параметр по умолчанию, передаваемый в функцию:

В первоначальном варианте был другой Магик. Я исправил в своём коде обращение к этой функции. Посмотрите под каким Магиком открыты сейчас ордера и поставьте в советнике этот номер Магика.


Нет по мейджику все правильно, тот который для EURAUD_AUDUSD - 1111, а тот который EURUSD_GBPUSD - 1114 (помогал исправлять другой человек). Оба варианта сделки не закрывают. Сижу наблюдаю суммарный профит по EURUSD_GBPUSD, а закрыть его советником не могу. Переделал Ваш вариант для EURAUD_AUDUSD - 1111 под EURUSD_GBPUSD - 1114 тоже не закрывает сделки. Особенность совы в том, что нельзя ее проверить в тестере (т.к. две пары принимают участие в торгах) - только на демке.
 
alexey1979621:

Нет по мейджику все правильно, тот который для EURAUD_AUDUSD - 1111, а тот который EURUSD_GBPUSD - 1114 (помогал исправлять другой человек). Оба варианта сделки не закрывают. Сижу наблюдаю суммарный профит по EURUSD_GBPUSD, а закрыть его советником не могу. Переделал Ваш вариант для EURAUD_AUDUSD - 1111 под EURUSD_GBPUSD - 1114 тоже не закрывает сделки. Особенность совы в том, что нельзя ее проверить в тестере (т.к. две пары принимают участие в торгах) - только на демке.


Давай проведем некоторые изменения. Вместо

if(prof>=Profit)
   {
  for(int i=OrdersTotal()-1;i>=0;i--) 
      {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
     double AS=MarketInfo(OrderSymbol(), MODE_ASK);
     double BI=MarketInfo(OrderSymbol(), MODE_BID);

       if(OrderType()==OP_BUY) price=BI;
       else                    price=AS;

       OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
         }
      }   
   }

поставьте

Comment("Profit = ",prof);
if(prof>=Profit)
   {
Print("Profit is good!");
  for(int i=OrdersTotal()-1;i>=0;i--) 
      {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
     double AS=MarketInfo(OrderSymbol(), MODE_ASK);
     double BI=MarketInfo(OrderSymbol(), MODE_BID);

       if(OrderType()==OP_BUY) price=BI;
       else                    price=AS;
       Print("OrderTicket - ",OrderTicket()," price - ",price);
       if(!OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE))Print ("Error - ",GetLastError());
         }
      }   
   }
запустите советник, поставьте профит равный нулю и посмотрите, что получилось и что в логах.
 
Roger:


Глянь на эту строку

else if (order_type = OP_SELL()


спасибо!)
 
alexey1979621:

Нет по мейджику все правильно, тот который для EURAUD_AUDUSD - 1111, а тот который EURUSD_GBPUSD - 1114 (помогал исправлять другой человек). Оба варианта сделки не закрывают. Сижу наблюдаю суммарный профит по EURUSD_GBPUSD, а закрыть его советником не могу. Переделал Ваш вариант для EURAUD_AUDUSD - 1111 под EURUSD_GBPUSD - 1114 тоже не закрывает сделки. Особенность совы в том, что нельзя ее проверить в тестере (т.к. две пары принимают участие в торгах) - только на демке.

Во-первых, Вы не правильно обращаетесь к индикатору. У этого индикатора куча внешних параметров:

extern string Symbol1.Name      = "EURUSD";// Название инструмента 1
extern bool   Symbol1.Reverse   = false;   // Является ли инструмент 1 реверсивным (с обратной корреляцией) 
                                           // по отношению к остальным инструментам
extern string Symbol2.Name      = "USDCHF";// Название инструмента 2
extern bool   Symbol2.Reverse   = false;   // Является ли инструмент 2 реверсивным (с обратной корреляцией) 
                                           // по отношению к остальным инструментам
extern string  ___MISC___       = " == Прочие настройки ==========";
extern bool   UseVolatility     = True ;   //отрисовка с учетом волатильности
extern bool   Triangle          = True ;   // Рисовать треугольник?
extern color  Triangle.Color    = DarkSalmon; // Цвет треугольника
extern double Alert.ChannelMore = EMPTY;   // Если ширина канала больше указанной, включается сигнал
                                           //   -1 - контроль выключен.
extern double Alert.ChannelLess = EMPTY;   // Если ширина канала меньше указанной, включается сигнал
                                           //   -1 - контроль выключен.
extern string  __VOL___         = " == Расчет объемов ====";
extern int VOL.Mode             = 3;       // Режим расчета объемов для торговли
                                           //   1 - по ценам открытия
                                           //   2 - по волатильности, а если невозможно - по ценам открытия
                                           //   3 - по волатильности (если возможно) и ценам открытия
extern int VOL.PeriodATR        = 144;            // Период усреднения ATR 
extern string  ___MA___         = " == Параметры МА ценовых линий ====";

extern int MA.Slow              = 21;      // Период медленной МА
extern int MA.Fast              = 8;       // Период быстрой МА
extern int MA.Method            = 2;       // Метод аппроксимации
                                           // - MODE_SMA=0 Простое скользящее среднее 
                                           // - MODE_EMA=1 Экспоненциальное скользящее среднее 
                                           // - MODE_SMMA=2 Сглаженное скользящее среднее 
                                           // - MODE_LWMA=3 Линейно-взвешенное скользящее среднее 
extern int MA.Price             = 6;       // Расчетная цена:
                                           // - PRICE_CLOSE=0 Цена закрытия 
                                           // - PRICE_OPEN=1 Цена открытия 
                                           // - PRICE_HIGH=2 Максимальная цена 
                                           // - PRICE_LOW=3 Минимальная цена 
                                           // - PRICE_MEDIAN=4 Средняя цена, (high+low)/2 
                                           // - PRICE_TYPICAL=5 Типичная цена, (high+low+close)/3 
                                           // - PRICE_WEIGHTED=6 Взвешенная цена закрытия, (high+low+close+close)/4 

и их нужно перечислять при вызове индикатора. Если их упускать, то параметры будут браться по умолчанию, а так как Вы хотите использовать для разных валютных пар, то этот вариант не подходит. А всё остальное можно сделать с учётом изменения параметров при запуске советника:

extern string Symbol_1 = "EURAUD";
extern string Symbol_2 = "AUDUSD";
extern double Lot_1=0.01;
extern double Lot_2=0.01;
extern double Profit=10;
extern string EXP_Comment           = "KVAZ_";
extern int    Magic                 = 1111;

string gsa_SMB[2];
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
  gsa_SMB[0] = Symbol_1;
  gsa_SMB[1] = Symbol_2;
  EXP_Comment = StringConcatenate (EXP_Comment, Symbol_1, "_", Symbol_2);
   return (0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
    int    li_N;
    double prof = 0., ld_Price = 0.;

    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        OrderSelect (i, SELECT_BY_POS);
        li_N = fGet_NumSymbol (OrderSymbol(), gsa_SMB);
        if (li_N < 0) continue;
        if (OrderMagicNumber() != Magic) continue;
        prof += OrderProfit();
        Print ("Profit=", prof);
    }
    if (prof >= Profit)
    {
        for (i = OrdersTotal() - 1; i >= 0; i--)
        {
            OrderSelect (i, SELECT_BY_POS);
            li_N = fGet_NumSymbol (OrderSymbol(), gsa_SMB);
            if (li_N < 0) continue;
            if (OrderMagicNumber() != Magic) continue;
            if (OrderType() == OP_BUY) ld_Price = MarketInfo (gsa_SMB[li_N], MODE_BID);
            else if (OrderType() == OP_SELL) ld_Price = MarketInfo (gsa_SMB[li_N], MODE_ASK);
            OrderClose (OrderTicket(), OrderLots(), ld_Price, 5);
        }
    }
    double lda_Price[2],
           Line_1 = iCustom (Symbol(), 0, "Ind_2 Line+1", 0, 1), // Первый инструмент
           Line_2 = iCustom (Symbol(), 0, "Ind_2 Line+1", 1, 1); // Второй инструмент

    if (NumberOfPositions (gsa_SMB[0], -1, Magic) == 0)
    {
        lda_Price[0] = MarketInfo (gsa_SMB[0], MODE_BID);
        lda_Price[1] = MarketInfo (gsa_SMB[0], MODE_ASK);
        if (Line_1 > 0.1) if (Line_2 < -0.1)
        {OrderSend (gsa_SMB[0], OP_SELL, Lot_1, lda_Price[0], 3, 0, 0, EXP_Comment, Magic, 0, Red);}
        if (Line_1 < -0.1) if (Line_2 > 0.1)
        {OrderSend (gsa_SMB[0], OP_BUY, Lot_1, lda_Price[1], 3, 0, 0, EXP_Comment, Magic, 0, Blue);}
    }
    if (NumberOfPositions (gsa_SMB[1], -1, Magic) == 0)
    {
        lda_Price[0] = MarketInfo (gsa_SMB[1], MODE_BID);
        lda_Price[1] = MarketInfo (gsa_SMB[1], MODE_ASK);
        if (Line_1 < -0.1) if (Line_2 > 0.1)
        {OrderSend (gsa_SMB[1], OP_BUY, Lot_2, lda_Price[1], 3, 0, 0, EXP_Comment, Magic, 0, Blue);}
        if (Line_1 > 0.1) if (Line_2 < -0.1)
        {OrderSend (gsa_SMB[1], OP_SELL, Lot_2, lda_Price[0], 3, 0, 0, EXP_Comment, Magic, 0, Red);}
    }
    return (0);
}
//+------------------------------------------------------------------+
int fGet_NumSymbol (string fs_Symbol, string ar_SMB[])
{
    for (int li_IND = 0; li_IND < 2; li_IND++)
    {if (fs_Symbol == ar_SMB[li_IND]) return (li_IND);}
    return (-1);
}
//+------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=1111)
{
  int i, k=OrdersTotal(), kp=0;
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }
        }
      }
    }
  }
  return(kp);
}
//+------------------------------------------------------------------+

А о вызове индикатора почитайте здесь.

 
Roger:


Давай проведем некоторые изменения. Вместо

поставьте

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


Получилось страшное. С Вашими изменениями и профитом равным 0 Советник закрыл вообще все позиции по Мейджикам 1111, 1112, 1113, 1114, 1115. Потом через секунд 5 открылись новые ордера по этим Мейджикам, через 10 секунд они все закрылись и все повторилось сначала. При это позиции открывались не парно, а хаотично.
 
alexey1979621:

Получилось страшное. С Вашими изменениями и профитом равным 0 Советник закрыл вообще все позиции по Мейджикам 1111, 1112, 1113, 1114, 1115. Потом через секунд 5 открылись новые ордера по этим Мейджикам, через 10 секунд они все закрылись и все повторилось сначала. При это позиции открывались не парно, а хаотично.


Наводящий вопрос - сколько советников у Вас стоит на этом счете?

И у Вас ведь было условие - по профиту закрыть все ордера.

PS Вы увидели какой подводный камень у Вас есть в этом советнике - он будет продолжать открывать ордера после закрытия, что в конце концов приведет к сливу. Поэтому надо ставить флаг, запрещающий выставлять новые одера, до тех пор пока условия не пройдут и возникнут вновь.

 
TarasBY:

Во-первых, Вы не правильно обращаетесь к индикатору. У этого индикатора куча внешних параметров:

и их нужно перечислять при вызове индикатора. Если их упускать, то параметры будут браться по умолчанию, а так как Вы хотите использовать для разных валютных пар, то этот вариант не подходит. А всё остальное можно сделать с учётом изменения параметров при запуске советника:

А о вызове индикатора почитайте здесь.

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


Наводящий вопрос - сколько советников у Вас стоит на этом счете?

И у Вас ведь было условие - по профиту закрыть все ордера.

PS Вы увидели какой подводный камень у Вас есть в этом советнике - он будет продолжать открывать ордера после закрытия, что в конце концов приведет к сливу. Поэтому надо ставить флаг, запрещающий выставлять новые одера, до тех пор пока условия не пройдут и возникнут вновь.


Советников работало 5 (братья близнецы - под разные пары), естественно с разными Мейджиками.


Да условие по профиту закрывать ордера было, но ордера относящиеся к конкретному советнику, скажем, с мейджиком 1114. Я писал об этом с самого начала, полагая, что сова при закрытии просто не видит свои ордера, а оказывается он видит все и очень хочет их закрыть, а нужно не все, а конкретные.

Подводный камень увидел, но не такой уж он подводный, если брать период Н4, то при расположении линий индикатора выше 0.1 и ниже -0.1 условие выполняется и сделки открываются, т.е. можно брать несколько профитов при одном сигнале (хотя есть и вариант закрывать сделку, когда линии индикатора сойдутся).

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