Ваши вопросы по языку MQL4

eevviill

Заблокирован
Я переписал эксперт, и теперь у него не всегда при модификации ставятся стопы(для есн. типа счетов).

...
Может кто подсказать где ошибка? По логике всё верно как я вижу.
А sl tp у тебя постоянно 0?
По идеи он у тебя только сл и тп ставит на 0. Тоесть если у ордера есть стопы, то он их на 0 выставляет.
 

eevviill

Заблокирован
Рекомендую тебе модифицировать ордер сразу после открытия. Таким образом не надо будет проверять стопы на каждом тике.

PHP:
int ticket_op=-1;
 
 while(IsTradeContextBusy()) Sleep(1000);
 ticket_op=OrderSend(Symbol(),OP_BUYLIMIT,NormalizeDouble(Lot_*K_Lot+PlusLot,Lot_digits),NormalizeDouble(price_b-Step*point,Digits),slippage,0,0,comment,mag,0,Green);
 Sleep(500);
 if(ticket_op>-1) {OrderSelect(ticket_op,SELECT_BY_TICKET); OrderModify(ticket_op,OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(price_b-Step*point+prof*point,Digits),CLR_NONE);}                    
 }
 
Последнее редактирование модератором:

hoz

Активный участник
А sl tp у тебя постоянно 0?
По идеи он у тебя только сл и тп ставит на 0. Тоесть если у ордера есть стопы, то он их на 0 выставляет.

С чего бы то это вдруг на ноль? Если стопы или тейки есть т.е. входные внешние параметры i_sl или i_tp не равны нулям, то стопы будут, так как сы их получаем(участок кода ниже) привожу
Ведь у нас (если для шорта):

PHP:
if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }


Значение sl и tp вычисляется, только если i_sl и i_tp не равны нулям.
 
Последнее редактирование модератором:

hoz

Активный участник
Рекомендую тебе модифицировать ордер сразу после открытия. Таким образом не надо будет проверять стопы на каждом тике.

PHP:
int ticket_op=-1;
 
 while(IsTradeContextBusy()) Sleep(1000);
 ticket_op=OrderSend(Symbol(),OP_BUYLIMIT,NormalizeDouble(Lot_*K_Lot+PlusLot,Lot_digits),NormalizeDouble(price_b-Step*point,Digits),slippage,0,0,comment,mag,0,Green);
 Sleep(500);
 if(ticket_op>-1) {OrderSelect(ticket_op,SELECT_BY_TICKET); OrderModify(ticket_op,OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(price_b-Step*point+prof*point,Digits),CLR_NONE);}                    
 }

Ну так работает... НО... тогда почему не работал прошлый вариант, есть какие-н. мысли? Ведь написано то всё было верно на первый взгляд. Хочется понять и уяснить раз и на всегда., чтоб в будущем такого головняка больше не возникало...
 

eevviill

Заблокирован
Ну так работает... НО... тогда почему не работал прошлый вариант, есть какие-н. мысли? Ведь написано то всё было верно на первый взгляд. Хочется понять и уяснить раз и на всегда., чтоб в будущем такого головняка больше не возникало...
Попробуй тут потсавить вместо g_ticket OrderTicket()
PHP:
OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);
 

hoz

Активный участник
Пробывал, нет разницы. У меня g_ticket это глобальная переменная, которая равна OrderTicket()
 

AlexeyVik

Программист mql4 mql5
Я переписал эксперт, и теперь у него не всегда при модификации ставятся стопы(для есн. типа счетов).

Вот что у меня в торговой ф-ции и ф-циях открытия и модификации):

PHP:
//+-------------------------------------------------------------------------------------+
//| Модификация ордеров для ECN - счетов                                                |
//+-------------------------------------------------------------------------------------+
bool OrdersModifying()
{
  int total = OrdersTotal() - 1;
  double sl = 0, tp = 0;
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(g_type == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(g_type == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(OrderStopLoss() != sl || OrderTakeProfit() != tp)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(g_ticket,OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }
  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
  g_ticket = -1;
  string myNote = "сов баянул";
  
  if(GetPriceToInput() < Ask)
  {       
    g_ticket = OrderSend(Symbol(),OP_BUYLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Blue);
  }
    if(g_ticket > 0 && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      if(!OrdersModifying())
        return(false);
    }

  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  g_ticket = -1;
  string myNote = "сов шортанул";

  if(GetPriceToInput() > Bid)
  {
    g_ticket = OrderSend(Symbol(),OP_SELLLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Red);
  }
    if(g_ticket > 0 && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      if(!OrdersModifying())
        return(false);
    }
  
  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade (int signal)
{
  FindOrders();

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет..
    if(!OpenBuy())                                                                  // открываем лимитный ордер на покупку
      return(false);                                                                
      
  if(signal == SIGNAL_SELL)                                                       // Если сигнал на продажу и открытых ордеров нет..
     if(!OpenSell())
       return(false);                                                              // открываем лимитный ордер на продажу

 //   if(OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES))
  //  {
   //     if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
    //    OrdersModifying();                                                             // Модифицируем ордер, добавим SL и TP
  //  }    
 // if(UseBU == true)
   //  MovingStopLossToBU();                                                         // Перевод в б.у. по достижению некоторого значения TP

  return(true);
}


Может кто подсказать где ошибка? По логике всё верно как я вижу.

.
Твоя основная ошибка в
Код:
 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if([B][COLOR=Red]g_type[/COLOR] == OP_BUY[/B])


Вм
есто g_type правильно будет написать OrderType();
А условие выбора ордера лучше писать так


Код:
if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
// здесь все операции с выбранным ордером.
}
.
И ещё, не путай глобальные переменные с переменными объявленными на глобальном уровне. Это абсолютно разные понятия.
 
Последнее редактирование:

hoz

Активный участник
Интересно, зачем тогда на глобальном уровне объявлять тикет, если он нельзя применить в подобном случае?
Ведь он у меня объявлен глобально и ему присвоено значение OrderTicket()
 

eevviill

Заблокирован
Интересно, зачем тогда на глобальном уровне объявлять тикет, если он нельзя применить в подобном случае?
Ведь он у меня объявлен глобально и ему присвоено значение OrderTicket()
Ну так правельно. И то что я тебе говорил и то что Алексей сказал нельзя писать. Так как на глобальном уровне и g_tick g_type присваивается значение не выбраного ордера(скорее всего первого открытого).
 

hoz

Активный участник
Кто его знает, что там присваивает глобальная переменная тикета, но я точно уяснил, что если ордеров несколько, т.е. торговля ведётся ни одним ордеров, то глобальные тикеты не нужны, проще их объявлять внутри функций, дабы не путаться.
Кстати, всё-равно, даже после исправления стопы не ставятся. Вот что вышло после исправления:

PHP:
//+-------------------------------------------------------------------------------------+
//| Модификация ордеров для ECN - счетов                                                |
//+-------------------------------------------------------------------------------------+
void OrdersModifying()
{
  int total = OrdersTotal() - 1;
  double sl = 0, tp = 0;
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(OrderType() == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(OrderType() == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
  int g_ticket = -1;
  string myNote = "сов баянул";
  
  if(GetPriceToInput() < Ask)
  {       
    g_ticket = OrderSend(Symbol(),OP_BUYLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Blue);
  }
    if(g_ticket > 0 && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)

  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  int g_ticket = -1;
  string myNote = "сов шортанул";

  if(GetPriceToInput() > Bid)
  {
    g_ticket = OrderSend(Symbol(),OP_SELLLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Red);
  }
    if(g_ticket > 0 && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
  
  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade (int signal)
{
  int total = OrdersTotal() - 1;
  
  FindOrders();

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет..
    if(!OpenBuy())                                                                  // открываем лимитный ордер на покупку
      return(false);                                                                
      
  if(signal == SIGNAL_SELL)                                                       // Если сигнал на продажу и открытых ордеров нет..
     if(!OpenSell())
       return(false);                                                              // открываем лимитный ордер на продажу

    OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES);
    {
      if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
        OrdersModifying();                                                             // Модифицируем ордер, добавим SL и TP
    }    
 // if(UseBU == true)
   //  MovingStopLossToBU();                                                         // Перевод в б.у. по достижению некоторого значения TP

  return(true);
}


Как посоветовал ты, eevviill работает всё исправно. А вот в том виде, что выше не работает.

Т.е. вот так всё работает идеально:

PHP:
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
  g_ticket = -1;
  string myNote = "сов баянул";
  
  if(GetPriceToInput() < Ask)
  {       
    g_ticket = OrderSend(Symbol(),OP_BUYLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Blue);
  }
    if(g_ticket > 0 && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      OrderModify(g_ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits),NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits),OrderOpenTime() + 86400,Lime);
    }

  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  g_ticket = -1;
  string myNote = "сов шортанул";

  if(GetPriceToInput() > Bid)
  {
    g_ticket = OrderSend(Symbol(),OP_SELLLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Red);
  }
    if(g_ticket > 0 && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      OrderModify(g_ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits),NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits),OrderOpenTime() + 86400,Lime);
    }
  
  return(true);
}


А то что первоначально я написал код, не пашет категорически.
 
Последнее редактирование модератором:

AlexeyVik

Программист mql4 mql5
Интересно, зачем тогда на глобальном уровне объявлять тикет, если он нельзя применить в подобном случае?
Ведь он у меня объявлен глобально и ему присвоено значение OrderTicket()

Ну очень удивительно как ты можешь хоть что-то написать с такой способностью путать тикет ордера то с магиком то с типом ордера.
 

AlexeyVik

Программист mql4 mql5
Ну так правельно. И то что я тебе говорил и то что Алексей сказал нельзя писать. Так как на глобальном уровне и g_tick g_type присваивается значение не выбраного ордера(скорее всего первого открытого).

Василий, а ты почему не видишь таких ляпов и помогаешь запутаться?
До сообщения hoz с этим кодом разговор шёл только о тикете ордера, а ты приплёл сюда ещё и тип. Ну объявлена переменная на глобальном уровне и что??? Ведь ей надо присвоить значение. Писать то надо Ticket = OrderSend(); только тогда можно будет с этим тикетом работать. И зачем все переменные объявлять на глобальном уровне??? Зачем тип ордера вообще в переменную записывать?

Я говорил только о том, что если объявить тикет на глобальном уровне то выбрать ордер для определения его свойств, таких как тип, СЛ, ТП, цена и время открытия ордера, можно без цикла, по тикету. Но и этим надо пользоваться с пониманием или хотя-бы прочесть справку.
Параметр pool игнорируется, если ордер выбирается по номеру тикета. Номер тикета является уникальным идентификатором ордера. Чтобы определить, из какого списка выбран ордер, необходимо проанализировать его время закрытия. Если время закрытия ордера равно 0, то ордер является открытым или отложенным и взят из списка открытых позиций терминала. Отличить открытую позицию от отложенного ордера можно по типу ордера. Если время закрытия ордера не равно 0, то ордер является закрытым или удаленным отложенным и был выбран из истории терминала. Отличить закрытый ордер от удаленного отложенного также можно по типу ордера.
 

AlexeyVik

Программист mql4 mql5
Кто его знает, что там присваивает глобальная переменная тикета, но я точно уяснил, что если ордеров несколько, т.е. торговля ведётся ни одним ордеров, то глобальные тикеты не нужны, проще их объявлять внутри функций, дабы не путаться.
Кстати, всё-равно, даже после исправления стопы не ставятся. Вот что вышло после исправления:

PHP:
//+-------------------------------------------------------------------------------------+
//| Модификация ордеров для ECN - счетов                                                |
//+-------------------------------------------------------------------------------------+
void OrdersModifying()
{
  int total = OrdersTotal() - 1;
  double sl = 0, tp = 0;
  
  for(int i=total; i>=0; i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)                            // Если ордер есть и он выбран..
    {
      if(OrderType() == OP_BUY)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits);                    // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits);                    // Получаем значение тейкпрофита для выбранного ордера
      }
      if(OrderType() == OP_SELL)
      {
        if(i_sl != 0)                                                                 // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits);                // Получаем значение стоп-лосса для выбранного ордера
        if(i_tp != 0)                                                                 // Если входной параметр тейкпрофита не равен 0, то..
           tp = NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits);                // Получаем значение тейкпрофита для выбранного ордера
      }
      if(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
  int g_ticket = -1;
  string myNote = "сов баянул";
  
  if(GetPriceToInput() < Ask)
  {       
    g_ticket = OrderSend(Symbol(),OP_BUYLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Blue);
  }
    if(g_ticket > 0 && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)

  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  int g_ticket = -1;
  string myNote = "сов шортанул";

  if(GetPriceToInput() > Bid)
  {
    g_ticket = OrderSend(Symbol(),OP_SELLLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Red);
  }
    if(g_ticket > 0 && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
  
  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade (int signal)
{
  int total = OrdersTotal() - 1;
  
  FindOrders();

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет..
    if(!OpenBuy())                                                                  // открываем лимитный ордер на покупку
      return(false);                                                                
      
  if(signal == SIGNAL_SELL)                                                       // Если сигнал на продажу и открытых ордеров нет..
     if(!OpenSell())
       return(false);                                                              // открываем лимитный ордер на продажу

    OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES);
    {
      if(OrderStopLoss() == 0 || OrderTakeProfit() == 0)
        OrdersModifying();                                                             // Модифицируем ордер, добавим SL и TP
    }    
 // if(UseBU == true)
   //  MovingStopLossToBU();                                                         // Перевод в б.у. по достижению некоторого значения TP

  return(true);
}


Как посоветовал ты, eevviill работает всё исправно. А вот в том виде, что выше не работает.

Т.е. вот так всё работает идеально:

PHP:
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
  g_ticket = -1;
  string myNote = "сов баянул";
  
  if(GetPriceToInput() < Ask)
  {       
    g_ticket = OrderSend(Symbol(),OP_BUYLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Blue);
  }
    if(g_ticket > 0 && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      OrderModify(g_ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice() - i_sl*pt,Digits),NormalizeDouble(OrderOpenPrice() + i_tp*pt,Digits),OrderOpenTime() + 86400,Lime);
    }

  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  g_ticket = -1;
  string myNote = "сов шортанул";

  if(GetPriceToInput() > Bid)
  {
    g_ticket = OrderSend(Symbol(),OP_SELLLIMIT,0.1,GetPriceToInput(),3,0,0,myNote,myMagic,0,Red);
  }
    if(g_ticket > 0 && OrderSelect(g_ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    {
      OrderModify(g_ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice() + i_sl*pt,Digits),NormalizeDouble(OrderOpenPrice() - i_tp*pt,Digits),OrderOpenTime() + 86400,Lime);
    }
  
  return(true);
}


А то что первоначально я написал код, не пашет категорически.

А это уже вообще ни в какие рамки не лезет...
Как можно открывать OP_BUYLIMIT и OP_SELLLIMIT, а модифицировать OP_BUY и OP_SELL
Не удивительно что не работает...
 

eevviill

Заблокирован
А это уже вообще ни в какие рамки не лезет...
Как можно открывать OP_BUYLIMIT и OP_SELLLIMIT, а модифицировать OP_BUY и OP_SELL
Не удивительно что не работает...
Ага точно. Я и не заметил.

P.S. Просто hoz пишет много лишнего и я хочу помочь, но плутаюсь.
 

Essam

Элитный участник
:)

#property copyright "eevviill"
#property link "[email protected]"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 OrangeRed

double ExtMapBuffer1[];
double ExtMapBuffer2[];
extern int MA_fast_period = 40;
extern int MA_slow_period = 60;

bool gi_76 = FALSE;
bool gi_80 = FALSE;
bool gi_84 = FALSE;
int gi_unused_104 = 0;
string gs_88 = "alert.wav";
double gd_unused_108 = 0.618;
int gi_116 = 3;
int gi_120 = 0;
int gi_124 = 0;
int gi_128 = 0;
double g_ibuf_132[];
double g_ibuf_136[];
double g_bars_140;

int init()
{

SetIndexBuffer(0,ExtMapBuffer1);
SetIndexStyle(0,DRAW_ARROW,1,10);
SetIndexArrow(0,71);

SetIndexBuffer(1,ExtMapBuffer2);
SetIndexStyle(1,DRAW_ARROW,1,10);
SetIndexArrow(1,72);

return;
}


int start()
{
int li_4 = IndicatorCounted();
if (li_4 < 0) li_4 = 0;
if (li_4 > 0) li_4--;
int li_0 = Bars - li_4;
for (int li_8 = 0; li_8 < li_0; li_8++){
double MA1 = iMA(Symbol(),0,MA_fast_period,0,MODE_LWMA,PRICE_CLOSE,li_8+1);
double MA11 = iMA(Symbol(),0,MA_fast_period,0,MODE_LWMA,PRICE_CLOSE,li_8);
double MA2 = iMA(Symbol(),0,MA_slow_period,0,MODE_LWMA,PRICE_CLOSE,li_8+1);
double MA22 = iMA(Symbol(),0,MA_slow_period,0,MODE_LWMA,PRICE_CLOSE,li_8);
//if(MA11<MA22 && MA1>MA2) ExtMapBuffer1[li_8] =High[li_8]; //up
//if(MA11>MA22 && MA1<MA2) ExtMapBuffer2[li_8] =Low[li_8] ; //down

if (MA11 > MA22 + gi_128 * Point && MA1 <= MA2) {
ExtMapBuffer1[li_8] = iLow(Symbol(), 0, li_8) - 3.0 * Point;
ExtMapBuffer2[li_8] = EMPTY_VALUE;
if (gi_76 == TRUE) PlaySound(gs_88);
if (gi_84 == TRUE && Bars > g_bars_140) {
Alert(Symbol(), "Buy signal", Period());
g_bars_140 = Bars;
}
if (gi_80 == TRUE) Comment("Buy signal at Ask=", Ask, ", Bid=", Bid, ", Date=", TimeToStr(TimeCurrent(), TIME_DATE), " ", TimeHour(TimeCurrent()), ":", TimeMinute(TimeCurrent()), " Symbol=", Symbol(), " Period=", Period());
} else {
if (MA1 >= MA2 && MA11 < MA22 - gi_124 * Point) {
ExtMapBuffer1[li_8] = EMPTY_VALUE;
ExtMapBuffer2[li_8] = iHigh(Symbol(), 0, li_8) + 3.0 * Point;
if (gi_76 == TRUE) PlaySound(gs_88);
if (gi_84 == TRUE && Bars > g_bars_140) {
Alert(Symbol(), "Sell signal", Period());
g_bars_140 = Bars;
}
if (gi_80 == TRUE) Comment("Sell signal at Ask=", Ask, ", Bid=", Bid, ", Date=", TimeToStr(TimeCurrent(), TIME_DATE), " ", TimeHour(TimeCurrent()), ":", TimeMinute(TimeCurrent()), " Symbol=", Symbol(), " Period=", Period());
} else {
ExtMapBuffer1[li_8] = EMPTY_VALUE;
ExtMapBuffer2[li_8] = EMPTY_VALUE;
}
}
}

return;
}
 

mogul

Новичок форума
Приветствую всех. Нужна помощь.
есть хай и лоу (произвольно выбираем на графике, например 1.3157 и 1.3084). как мне посчитать колличество баров от этих хая до лоу? вывести нужно в Comment ("..., это сам сделаю, а вот посчитать не получается .
 

Ugar

Гуру форума
Приветствую всех. Нужна помощь.
есть хай и лоу (произвольно выбираем на графике, например 1.3157 и 1.3084). как мне посчитать колличество баров от этих хая до лоу? вывести нужно в Comment ("..., это сам сделаю, а вот посчитать не получается .
Между двумя ценами нет баров, есть пункты. Можно конечно перебрать в цикле бары и найти к хаю какого бара эта цена относится. Но цена может оказаться такой что не будет существовать бара с таким хаем, а может оказаться несколько баров с таким хаем.
Если имеется ввиду хай какого то конкретного бара, то и сам хай не нужен. Если оба бара известны то просто номер одного вычесть из номера второго.
 

mogul

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

mogul

Новичок форума
вот например участок который надо посчитать, так наглядней, а то может я не так вопрос задаю:
хай - 1.31253 от 2012.12.05 10:00
лоу - 1.28769 от 2012.12.07 15:30

на этом участке примерно 125 баров, мог сбиться немного, вручную считал, как вот програмно?

т.е. я ввел нужные мне цены с известной датой и индикатор мне бы дал ответ = 125 штук.
 
Последнее редактирование:

Ugar

Гуру форума
вот например участок который надо посчитать, так наглядней, а то может я не так вопрос задаю:
хай - 1.31253 от 2012.12.05 10:00
лоу - 1.28769 от 2012.12.07 15:30

на этом участке примерно 125 баров, мог сбиться немного, вручную считал, как вот програмно?

т.е. я ввел нужные мне цены с известной датой и индикатор мне бы дал ответ = 125 штук.
Зачем вводить цены если дата и время известны? Достаточно ввести дату и время двух баров. Примерно так:
Код:
   string TimeStp1="2012.12.05 10:00";
   string TimeStp2="2012.12.07 15:30";
   //Преобразование строки в время
   datetime Time1=StrToTime(TimeStp1);
   datetime Time2=StrToTime(TimeStp2);
   //Поиск бара по времени
   int Bar1=iBarShift(NULL,0,Time1,false);
   int Bar2=iBarShift(NULL,0,Time2,false);
   //Разница между номерами баров
   int Result=Bar1-Bar2;
Постарался написать максимально просто. Дата и время вводится в виде строки в строчные переменные TimeStp1 и TimeStp2.
Если время уже в формате datetime то преобразовывать строку в время не нужно. Время сразу записать в переменные Time1 и Time2.
 
Верх