Logo

Вход

Войти с помощью соц. сетей
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения
ТОП СООБЩЕНИЙ
14.01.2016, 21:56
Лучший ответ
А условие OrdersTotal разве распространяется на OrderSend?

MQL код:
if (OrdersTotal()!=0)                                                                    // Проверяем условие
{ // Если верно, то..
OrderClose(TS, Lot, Ask, 10, clrRed); // ..выполняем OrderClose
} // Выходим из if
TB=OrderSend (Gold, 0, Lot, Ask, 10, 0, 0, NULL, 7355, 0, clrRed); // Продолжаем выполнение программы - открываем ордер

Я ведь правильно понимаю?

И еще:
Вот такая ситуация: подряд стоят OrderClose и OrderSend, начинает выполняться OrderClose, но такого ордера, например, на закрытие вообще нет (короче, возвращает false). Программа дальше будет выполняться? - OrderSend выполнится? Или выдаст ошибку и закроет программу?

P.S. спасибо за помощь
14.01.2016, 22:40
Лучший ответ
Сообщение от voronovmakcum Посмотреть сообщение
P.S. спасибо за помощь
Первая строка что проверяет? Общее количество ордеров в терминале. А в нём могут быть открыты ордера в ручную, или
другими советниками. И для чего она в данном советнике? Ордер нужно проверить от этого советника. А проверить можно
только по тикету. Тикет есть-закрываем ордер и открываем новый. Тикета нет- только открываем ордер.
16.01.2016, 20:30
Лучший ответ
Так?

MQL код:
if (B84 < B88 && B84P1 < B88P1 && B84P2 > B88P2 && B84P3 > B88P3)
{


if (TS>0)
{
OrderClose(TS, Lot, Ask, 10, clrRed);
TS=0;
}

TB=OrderSend (Gold, 0, Lot, Ask, 10, 0, 0, NULL, 7355, 0, clrRed);
}

if (B84 > B88 && B84P1 > B88P1 && B84P2 < B88P2 && B84P3 < B88P3)
{


if (TB>0)
{
OrderClose(TB, Lot, Bid, 10, clrRed);
TB=0;
}

TS=OrderSend (Gold, 1, Lot, Bid, 10, 0, 0, NULL, 7355, 0, clrRed);
}
BarTime=Time[0];
}
}
16.01.2016, 22:52
Лучший ответ
Сообщение от voronovmakcum Посмотреть сообщение
Так?
Не хватает ещё одного условия, условия для открытия ордера, если он уже открыт. Сейчас ордера будут открываться на каждом тике
по ордеру в неограниченном количестве, если совпадает условие по индикаторам. Нужна такая же проверка, как и при закрытии ордера.
19.01.2016, 01:22
Лучший ответ
А если у меня такая конструкция?


MQL код:
void OnTick()
{
if (BarTime!=Time[0]) // Проверяем открытие новой свечи: если время открытия предыдущей не равно открытию данной..
{ // ..свечи, то выполняем программу
double B84;
double B88;
double B84P1;
double B88P1;
double B84P2;
double B88P2;
double B84P3;
double B88P3;

B88=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, 0);
B84=iCustom(Gold, 1440, "SkdonB", 1, 7, 0, 0);
B84P1=iCustom(Gold, 1440, "SkdonB", 1, 7, 0, 1);
B88P1=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, 1);
B84P2=iCustom(Gold, 1440, "SkdonB", 1, 7, 0, 2);
B88P2=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, 2);
B84P3=iCustom(Gold, 1440, "SkdonB", 1, 7, 0, 3);
B88P3=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, 3);

if (B84 < B88 && B84P1 < B88P1 && B84P2 > B88P2 && B84P3 > B88P3)
{


if (TS>0)
{
OrderClose(TS, Lot, Ask, 10, clrRed);
TS=0;
}

TB=OrderSend (Gold, 0, Lot, Ask, 10, 0, 0, NULL, 7355, 0, clrRed);
}

if (B84 > B88 && B84P1 > B88P1 && B84P2 < B88P2 && B84P3 < B88P3)
{


if (TB>0)
{
OrderClose(TB, Lot, Bid, 10, clrRed);
TB=0;
}

TS=OrderSend (Gold, 1, Lot, Bid, 10, 0, 0, NULL, 7355, 0, clrRed);
}
BarTime=Time[0]; // Если свеча новая, то в BarTime заносим время ее открытия
} // Закрытие if с проверкой времени
}
19.01.2016, 16:16
Лучший ответ
Сообщение от voronovmakcum Посмотреть сообщение
А если у меня такая конструкция?
Повторяю ещё раз. Чтобы закрыть ордер-что делаем, проверяем, есть этот ордер или нет, если есть, то закрываем.
Если нет ордера, то ничего не делаем.
Сообщение от voronovmakcum Посмотреть сообщение
MQL код:
if (TS>0)
{
OrderClose(TS, Lot, Ask, 10, clrRed);
TS=0;
}
Для открытия ордера поступаем также. Проверяем, есть открытый ордер или нет? Если ордера нет, то открываем
ордер, если ордер есть, то ничего не делаем. Это нужно для того, что бы на одном сигнале индикатора не выставлялось куча ордеров,
а только один.
  • #1 Свернуть

    Не могу разобраться с советником, помогите

    Написал советник по индикатору, но в тестере не работает (ошибки прописаны в комментариях после кода). Помогите пожалуйста разобраться.
    Вот код: (+ прикрепил файл с кодом)
    MQL код:
    extern int MaMetod = 3;         

    extern int MaPeriod = 20;

    double g_ibuf_84[];

    double g_ibuf_88[];

    double g_ibuf_92[];

    double g_ibuf_96[];

    double g_ibuf_100[];

    double g_ibuf_104[];

    int gi_108 = 0;

    datetime BarTime; // Все параметры выше - параметры из индикатора. BarTime и ниже - мои

    int T;

    extern double Lot=0.01;



    int init() {

    SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 1, Red); // Вся функция init из индикатора

    SetIndexBuffer(0, g_ibuf_84);

    SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, 1, MediumBlue);

    SetIndexBuffer(1, g_ibuf_88);

    SetIndexStyle(2, DRAW_HISTOGRAM, STYLE_SOLID, 2, Red);

    SetIndexBuffer(2, g_ibuf_92);

    SetIndexStyle(3, DRAW_HISTOGRAM, STYLE_SOLID, 2, MediumBlue);

    SetIndexBuffer(3, g_ibuf_96);

    SetIndexStyle(4, DRAW_ARROW, STYLE_SOLID, 3);

    SetIndexBuffer(4, g_ibuf_100);

    SetIndexArrow(4, 233);

    SetIndexStyle(5, DRAW_ARROW, STYLE_SOLID, 3);

    SetIndexBuffer(5, g_ibuf_104);

    SetIndexArrow(5, 234);

    SetIndexDrawBegin(0, 5);

    SetIndexBuffer(0, g_ibuf_84);

    SetIndexBuffer(1, g_ibuf_88);

    SetIndexBuffer(2, g_ibuf_92);

    SetIndexBuffer(3, g_ibuf_96);

    return (0);

    }

    // В функции OnTick все строчки со словами Time и Order - мои. Все остальное - индикатор





    void OnTick()

    {

    if (BarTime!=Time[0]) // Проверяем на открытие новой свечи. Если новая, то выполняем всю функцию OnTick

    {

    double l_ima_0;

    double l_ima_8;

    double l_ima_16;

    double l_ima_24;

    double ld_32;

    double ld_40;

    double ld_48;

    double ld_56;

    BarTime=Time[0]; // Опять же к новой свече - даем переменной время открытия новой свечи для дальнейшего сравнения



    if (Bars <= 10) return ;

    gi_108 = IndicatorCounted();

    if (gi_108 < 0) return ;

    if (gi_108 > 0) gi_108--;

    for (int li_80 = Bars - gi_108 - 1; li_80 >= 0; li_80--) {

    l_ima_0 = iMA(NULL, 0, MaPeriod, 0, MaMetod, PRICE_CLOSE, li_80);

    l_ima_8 = iMA(NULL, 0, MaPeriod, 0, MaMetod, PRICE_LOW, li_80);

    l_ima_16 = iMA(NULL, 0, MaPeriod, 0, MaMetod, PRICE_OPEN, li_80);

    l_ima_24 = iMA(NULL, 0, MaPeriod, 0, MaMetod, PRICE_HIGH, li_80);

    ld_32 = (g_ibuf_92[li_80 + 1] + (g_ibuf_96[li_80 + 1])) / 2.0;

    ld_56 = (l_ima_0 + l_ima_24 + l_ima_16 + l_ima_8) / 4.0;

    ld_40 = MathMax(l_ima_24, MathMax(ld_32, ld_56));

    ld_48 = MathMin(l_ima_16, MathMin(ld_32, ld_56));

    if (ld_32 < ld_56) {

    g_ibuf_84[li_80] = ld_48;

    if (g_ibuf_84[li_80] < g_ibuf_88[li_80] && g_ibuf_84[li_80 + 1] < g_ibuf_88[li_80 + 1] && g_ibuf_84[li_80 + 2] > g_ibuf_88[li_80 + 2] && g_ibuf_84[li_80 + 3] > g_ibuf_88[li_80 +

    3]) g_ibuf_100[li_80] = ld_48 - 10.0 * Point;

    g_ibuf_88[li_80] = ld_40;

    OrderSelect (0, SELECT_BY_POS, MODE_TRADES); // Я определил, что здесь надо покупать:

    if (OrderType()!=0) // закрываю продажу и открываю покупку, если ее еще нет

    {

    T=OrderTicket();

    OrderClose (T, Lot, Ask, 10, clrRed);

    OrderSend (Symbol(), 0, Lot, Ask, 10, 0, 0, NULL, 7355, 0, clrRed);

    }

    } else {

    g_ibuf_84[li_80] = ld_40;

    g_ibuf_88[li_80] = ld_48;



    if (g_ibuf_84[li_80] > g_ibuf_88[li_80] && g_ibuf_84[li_80 + 1] > g_ibuf_88[li_80 + 1] && g_ibuf_84[li_80 + 2] < g_ibuf_88[li_80 + 2] && g_ibuf_84[li_80 + 3] < g_ibuf_88[li_80 +

    3]) g_ibuf_104[li_80] = ld_48 + 10.0 * Point;

    OrderSelect (0, SELECT_BY_POS, MODE_TRADES); // Здесь продавать:

    if (OrderType()!=1) // закрываю покупку и открываю продажу, если ее еще нет

    {

    T=OrderTicket();

    OrderClose (T, Lot, Bid, 10, clrRed);

    OrderSend (Symbol(), 1, Lot, Bid, 10, 0, 0, NULL, 7355, 0, clrRed);

    }

    }

    g_ibuf_92[li_80] = ld_32;

    g_ibuf_96[li_80] = ld_56;



    }

    }





    return ;

    }

    // Тестер выдает такие ошибки:

    // 2016.01.11 23:46:14.434 TestGenerator: unmatched data error (low value 1144.60000 at 2015.10.29 00:00 is not reached from the least timeframe, low price 1150.54000 mismatches)

    // 2016.01.11 23:46:14.569 TestGenerator: unmatched data error (high value 1071.28000 at 2015.12.02 00:00 is not reached from the least timeframe, high price 1057.10000 mismatches)

    // 2016.01.11 23:46:14.660 TestGenerator: unmatched data error (high value 1080.57000 at 2015.12.22 00:00 is not reached from the least timeframe, high price 1078.14000 mismatches)

    // Далее идет:

    // 2016.01.11 23:46:16.182 2015.01.01 00:00 SkondTrend inputs: MaMetod=3; MaPeriod=20; Lot=0.01;

    // 2016.01.11 23:46:18.332 GOLD,Daily: 10036009 tick events (1265 bars, 10037010 bar states) processed in 0:00:02.153 (total time 0:00:09.095)

  • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
  • #2 Свернуть

    Сообщение от voronovmakcum Посмотреть сообщение
    Не могу разобраться с советником, помогите
    С декомпилами мало кто согласится разбираться. Может быть, лучше индикатор оставить в терминале, а в советнике использовать iCustom(...)?

    Комментарий

    • #3 Свернуть

      Сообщение от voronovmakcum Посмотреть сообщение
      Написал советник по индикатору
      Убери из кода советника весь код индикатора, здесь он не нужен. В советнике остаются только торговые функции, открыть ордер,
      модифицировать ордер, закрыть ордер, и всё, что зти функции обслуживает. Индикатор по void OnTick() не работает. Обращение к индикатору через функцию iCustom(...).

      Комментарий

      • #4 Свернуть

        Спасибо, попробую разобраться с этой функцией. Я недавно учу язык mql, много не знаю. Про функцию слышал, но особо не понял тогда как ее туда вставить

        Комментарий

        • #5 Свернуть

          Вот, что у меня получилось. iCustom я правильно использовал? - с параметрами индикатора я не понял немного. Тестер все равно не берет его.

          MQL код:
          extern int MaMetod = 3;
          extern int MaPeriod = 20;
          double Lot=0.01;


          //+------------------------------------------------------------------+
          //| Expert initialization function |
          //+------------------------------------------------------------------+
          int OnInit()
          {
          //---

          //---
          return(INIT_SUCCEEDED);
          }
          //+------------------------------------------------------------------+
          //| Expert deinitialization function |
          //+------------------------------------------------------------------+
          void OnDeinit(const int reason)
          {
          //---

          }
          //+------------------------------------------------------------------+
          //| Expert tick function |
          //+------------------------------------------------------------------+


          void OnTick()
          {
          datetime BarTime;
          if (BarTime!=Time[0])
          {
          double l_ima_0;
          double l_ima_8;
          double l_ima_16;
          double l_ima_24;
          double ld_32;
          double ld_40;
          double ld_48;
          double ld_56;
          int li_80;
          int T;
          double B4;
          double B1;
          double B5;
          double ld_32_1;
          double ld_32_2;


          li_80=Bars-1;

          l_ima_0 = iMA(NULL, 0, MaPeriod, 0, MaMetod, PRICE_CLOSE, li_80);
          l_ima_8 = iMA(NULL, 0, MaPeriod, 0, MaMetod, PRICE_LOW, li_80);
          l_ima_16 = iMA(NULL, 0, MaPeriod, 0, MaMetod, PRICE_OPEN, li_80);
          l_ima_24 = iMA(NULL, 0, MaPeriod, 0, MaMetod, PRICE_HIGH, li_80);
          ld_32_1=iCustom(Gold, 1440, "SkdonB", 1, 7, 2, li_80+1);
          ld_32_2=iCustom(Gold, 1440, "SkdonB", 1, 7, 3, li_80+1);
          ld_32 = (ld_32_1 + ld_32_2) / 2.0;
          ld_56 = (l_ima_0 + l_ima_24 + l_ima_16 + l_ima_8) / 4.0;
          ld_40 = MathMax(l_ima_24, MathMax(ld_32, ld_56));
          ld_48 = MathMin(l_ima_16, MathMin(ld_32, ld_56));

          B4=iCustom(Gold, 1440, "SkdonB", 1, 7, 4, li_80);
          B1=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, li_80);

          if ((B4 == ld_48 - 10.0 * Point) && (B1 == ld_40))
          {
          OrderSelect (0, SELECT_BY_POS, MODE_TRADES);
          if (OrderType()!=0)
          {
          T=OrderTicket();
          OrderClose (T, Lot, Ask, 10, clrRed);
          OrderSend (Gold, 0, Lot, Ask, 10, 0, 0, NULL, 7355, 0, clrRed);
          }
          }

          B5=iCustom(Gold, 1440, "SkdonB", 1, 7, 5, li_80);

          if (B5 == ld_48 + 10.0 * Point)
          {
          OrderSelect (0, SELECT_BY_POS, MODE_TRADES);
          if (OrderType()!=1)
          {
          T=OrderTicket();
          OrderClose (T, Lot, Bid, 10, clrRed);
          OrderSend (Gold, 1, Lot, Bid, 10, 0, 0, NULL, 7355, 0, clrRed);
          }
          }
          BarTime=Time[0];
          }




          }

          Комментарий

          • #6 Свернуть

            Сообщение от voronovmakcum Посмотреть сообщение
            Тестер все равно не берет его.
            Это не индикатор и не должен перебирать все значения графика, на который он ставится. Все значения индикаторов, включаемые
            в советник, используют конкретные бары графика, то есть нулевое-не сформированный бар, первый-сформированный бар.
            MQL код:
             l_ima_0 = iMA(NULL, 0, MaPeriod, 0, MaMetod, PRICE_CLOSE, [COLOR="#8b0000"]0[/COLOR]);
            l_ima_0 = iMA(NULL, 0, MaPeriod, 0, MaMetod, PRICE_CLOSE, [COLOR="#8b0000"]1[/COLOR]);

            и так далее.
            Последний раз редактировалось Gold; 13.01.2016, 07:57.

            Комментарий

            • #7 Свернуть

              Я решил, что проще будет так:
              Но тестер все равно не хочет ничего делать.

              MQL код:
              double Lot=0.01;
              datetime BarTime;


              //+------------------------------------------------------------------+
              //| Expert initialization function |
              //+------------------------------------------------------------------+
              int OnInit()
              {
              //---

              //---
              return(INIT_SUCCEEDED);
              }
              //+------------------------------------------------------------------+
              //| Expert deinitialization function |
              //+------------------------------------------------------------------+
              void OnDeinit(const int reason)
              {
              //---

              }
              //+------------------------------------------------------------------+
              //| Expert tick function |
              //+------------------------------------------------------------------+


              void OnTick()
              {
              if (BarTime!=Time[0])
              {
              int T;
              double B84;
              double B88;
              double B84P1;
              double B88P1;
              double B84P2;
              double B88P2;
              double B84P3;
              double B88P3;

              B88=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, 0);
              B84=iCustom(Gold, 1440, "SkdonB", 1, 7, 0, 0);
              B84P1=iCustom(Gold, 1440, "SkdonB", 1, 7, 0, 1);
              B88P1=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, 1);
              B84P2=iCustom(Gold, 1440, "SkdonB", 1, 7, 0, 2);
              B88P2=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, 2);
              B84P3=iCustom(Gold, 1440, "SkdonB", 1, 7, 0, 3);
              B88P3=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, 3);

              if (B84 < B88 && B84P1 < B88P1 && B84P2 > B88P2 && B84P3 > B88P3)
              {
              OrderSelect (0, SELECT_BY_POS, MODE_TRADES);
              if (OrderType()!=0)
              {
              T=OrderTicket();
              OrderClose (T, Lot, Ask, 10, clrRed);
              OrderSend (Gold, 0, Lot, Ask, 10, 0, 0, NULL, 7355, 0, clrRed);
              }
              }

              if (B84 > B88 && B84P1 > B88P1 && B84P2 < B88P2 && B84P3 < B88P3)
              {
              OrderSelect (0, SELECT_BY_POS, MODE_TRADES);
              if (OrderType()!=1)
              {
              T=OrderTicket();
              OrderClose (T, Lot, Bid, 10, clrRed);
              OrderSend (Gold, 1, Lot, Bid, 10, 0, 0, NULL, 7355, 0, clrRed);
              }
              }

              BarTime=Time[0];
              }
              }

              Комментарий

              • #8 Свернуть

                Сообщение от voronovmakcum Посмотреть сообщение
                Я решил, что проще будет так:
                Но тестер все равно не хочет ничего делать.
                Он ничего делать и не будет. Скорее всего нет ордера с нулевым номером в списке ордеров, вставь проверку принт на нулевой
                ордер, что бы в этом убедится. Сделай проще. Функция OrderSend возвращает тикет ордера при срабатывании, этот тикет нужно
                запомнить. Когда нужно закрыть ордер, в функцию OrderClose вставь этот тикет.
                Тестер стратегий работает только с данными графика, поэтому проверяй советник на графике того периода, который прописан
                в индикаторах.
                B88=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, 0);
                Последний раз редактировалось cgon; 13.01.2016, 23:13.

                Комментарий

                • #9 Свернуть

                  Переделал, проверяю на нужном, но все равно не работает.

                  MQL код:
                  double Lot=0.01;
                  datetime BarTime;
                  int TB;
                  int TS;


                  //+------------------------------------------------------------------+
                  //| Expert initialization function |
                  //+------------------------------------------------------------------+
                  int OnInit()
                  {
                  //---

                  //---
                  return(INIT_SUCCEEDED);
                  }
                  //+------------------------------------------------------------------+
                  //| Expert deinitialization function |
                  //+------------------------------------------------------------------+
                  void OnDeinit(const int reason)
                  {
                  //---

                  }
                  //+------------------------------------------------------------------+
                  //| Expert tick function |
                  //+------------------------------------------------------------------+


                  void OnTick()
                  {
                  if (BarTime!=Time[0])
                  {
                  double B84;
                  double B88;
                  double B84P1;
                  double B88P1;
                  double B84P2;
                  double B88P2;
                  double B84P3;
                  double B88P3;

                  B88=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, 0);
                  B84=iCustom(Gold, 1440, "SkdonB", 1, 7, 0, 0);
                  B84P1=iCustom(Gold, 1440, "SkdonB", 1, 7, 0, 1);
                  B88P1=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, 1);
                  B84P2=iCustom(Gold, 1440, "SkdonB", 1, 7, 0, 2);
                  B88P2=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, 2);
                  B84P3=iCustom(Gold, 1440, "SkdonB", 1, 7, 0, 3);
                  B88P3=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, 3);

                  if (B84 < B88 && B84P1 < B88P1 && B84P2 > B88P2 && B84P3 > B88P3)
                  {
                  if (OrdersTotal()!=0)
                  {
                  OrderClose(TS, Lot, Ask, 10, clrRed);
                  }
                  TB=OrderSend (Gold, 0, Lot, Ask, 10, 0, 0, NULL, 7355, 0, clrRed);
                  }

                  if (B84 > B88 && B84P1 > B88P1 && B84P2 < B88P2 && B84P3 < B88P3)
                  {
                  if (OrdersTotal()!=0)
                  {
                  OrderClose(TB, Lot, Bid, 10, clrRed);
                  }

                  TS=OrderSend (Gold, 1, Lot, Bid, 10, 0, 0, NULL, 7355, 0, clrRed);
                  }
                  BarTime=Time[0];
                  }
                  }

                  Комментарий

                  • #10 Свернуть

                    Сообщение от voronovmakcum Посмотреть сообщение
                    Переделал, проверяю на нужном, но все равно не работает.
                    Ну как же он заработает, если нет ни одного ордера. А условие if (OrdersTotal()!=0) разрешает работать только тогда,
                    когда есть хоть один ордер. Это условие лишнее. Главное условие это нет ордера и выполнение условий индикаторов.
                    И не забудь сделать сброс тикета, когда закроешь ордер.

                    Комментарий

                    • #11 Свернуть

                      А условие OrdersTotal разве распространяется на OrderSend?

                      MQL код:
                      if (OrdersTotal()!=0)                                                                    // Проверяем условие
                      { // Если верно, то..
                      OrderClose(TS, Lot, Ask, 10, clrRed); // ..выполняем OrderClose
                      } // Выходим из if
                      TB=OrderSend (Gold, 0, Lot, Ask, 10, 0, 0, NULL, 7355, 0, clrRed); // Продолжаем выполнение программы - открываем ордер

                      Я ведь правильно понимаю?

                      И еще:
                      Вот такая ситуация: подряд стоят OrderClose и OrderSend, начинает выполняться OrderClose, но такого ордера, например, на закрытие вообще нет (короче, возвращает false). Программа дальше будет выполняться? - OrderSend выполнится? Или выдаст ошибку и закроет программу?

                      P.S. спасибо за помощь

                      Комментарий

                      • #12 Свернуть

                        Сообщение от voronovmakcum Посмотреть сообщение
                        P.S. спасибо за помощь
                        Первая строка что проверяет? Общее количество ордеров в терминале. А в нём могут быть открыты ордера в ручную, или
                        другими советниками. И для чего она в данном советнике? Ордер нужно проверить от этого советника. А проверить можно
                        только по тикету. Тикет есть-закрываем ордер и открываем новый. Тикета нет- только открываем ордер.

                        Комментарий

                        • #13 Свернуть

                          Так?

                          MQL код:
                          if (B84 < B88 && B84P1 < B88P1 && B84P2 > B88P2 && B84P3 > B88P3)
                          {


                          if (TS>0)
                          {
                          OrderClose(TS, Lot, Ask, 10, clrRed);
                          TS=0;
                          }

                          TB=OrderSend (Gold, 0, Lot, Ask, 10, 0, 0, NULL, 7355, 0, clrRed);
                          }

                          if (B84 > B88 && B84P1 > B88P1 && B84P2 < B88P2 && B84P3 < B88P3)
                          {


                          if (TB>0)
                          {
                          OrderClose(TB, Lot, Bid, 10, clrRed);
                          TB=0;
                          }

                          TS=OrderSend (Gold, 1, Lot, Bid, 10, 0, 0, NULL, 7355, 0, clrRed);
                          }
                          BarTime=Time[0];
                          }
                          }

                          Комментарий

                          • #14 Свернуть

                            Сообщение от voronovmakcum Посмотреть сообщение
                            Так?
                            Не хватает ещё одного условия, условия для открытия ордера, если он уже открыт. Сейчас ордера будут открываться на каждом тике
                            по ордеру в неограниченном количестве, если совпадает условие по индикаторам. Нужна такая же проверка, как и при закрытии ордера.

                            Комментарий

                            • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
                            • #15 Свернуть

                              А если у меня такая конструкция?


                              MQL код:
                              void OnTick()
                              {
                              if (BarTime!=Time[0]) // Проверяем открытие новой свечи: если время открытия предыдущей не равно открытию данной..
                              { // ..свечи, то выполняем программу
                              double B84;
                              double B88;
                              double B84P1;
                              double B88P1;
                              double B84P2;
                              double B88P2;
                              double B84P3;
                              double B88P3;

                              B88=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, 0);
                              B84=iCustom(Gold, 1440, "SkdonB", 1, 7, 0, 0);
                              B84P1=iCustom(Gold, 1440, "SkdonB", 1, 7, 0, 1);
                              B88P1=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, 1);
                              B84P2=iCustom(Gold, 1440, "SkdonB", 1, 7, 0, 2);
                              B88P2=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, 2);
                              B84P3=iCustom(Gold, 1440, "SkdonB", 1, 7, 0, 3);
                              B88P3=iCustom(Gold, 1440, "SkdonB", 1, 7, 1, 3);

                              if (B84 < B88 && B84P1 < B88P1 && B84P2 > B88P2 && B84P3 > B88P3)
                              {


                              if (TS>0)
                              {
                              OrderClose(TS, Lot, Ask, 10, clrRed);
                              TS=0;
                              }

                              TB=OrderSend (Gold, 0, Lot, Ask, 10, 0, 0, NULL, 7355, 0, clrRed);
                              }

                              if (B84 > B88 && B84P1 > B88P1 && B84P2 < B88P2 && B84P3 < B88P3)
                              {


                              if (TB>0)
                              {
                              OrderClose(TB, Lot, Bid, 10, clrRed);
                              TB=0;
                              }

                              TS=OrderSend (Gold, 1, Lot, Bid, 10, 0, 0, NULL, 7355, 0, clrRed);
                              }
                              BarTime=Time[0]; // Если свеча новая, то в BarTime заносим время ее открытия
                              } // Закрытие if с проверкой времени
                              }
                              Последний раз редактировалось voronovmakcum; 19.01.2016, 01:28.

                              Комментарий

                              X