[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 631

 
anton.veksler:

Проблема с Symbol() MT4:

2 функции для иллюстрации:

Исполнение первой выводит пустую строку:

А вот вторая функция строковый идентификатор "EURUSD" (ну, зависит от графика, но выводи, хотя по логике функции должна быть пустая строка):

Помогите понять, что не так? Спасибо


Нельзя использовать при объявлении своих переменных зарезервированные названия(value), назовите  _value
 
hoz:


 Вот я так сделал:

 

  Стопов и тейков нет. В журнале пишится ошибка 130, мол не верный стопы. Причины я не наблюдаю.

И не будут!

  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) // замените на if(sl == 0)                   // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits);  // Если по нулям, тогда выполнится условие!
 

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

До этого у меня всё (открытие ордеров - модификация и перевод в б.у. по достижению заданного уровня цены) и всё работало. Было так:

bool Trade (int signal)
{
  FindOrders();
  
  double sl = 0, tp = 0;

  if(signal == SIGNAL_BUY)                                                          // Если сигнал на покупку и открытых ордеров нет...
    if(!OpenBuy())                                                           // открываем лимитный ордер на покупку
      return(false);
        
  if(signal == SIGNAL_SELL)                               // Если сигнал на продажу и открытых ордеров нет..
    if(!OpenSell())                                                          // Открываем лимитный ордер на продажу
      return(false);
  
  int total = OrdersTotal() - 1;
  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(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }

  return(true);
}

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

 
borilunad:

И не будут!

 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) // замените на if(sl == 0)                   // Если входной параметр стоп-лосса не равен 0, то..
           sl = NormalizeDouble(OrderOpenPrice() - SL*pt,Digits);  // Если по нулям, тогда выполнится условие!

 Ну а логика то где? Хочется понять очень.. Есть вот функция:

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(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(sl != 0 || tp != 0)                                                            // Если полученные значения sl и tp не равныы 0, то..
      {
        OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,OrderOpenTime() + 86400,Lime);      // Модифицируем ордер
      }
    }
  }
}

  Порядок такой, если вводные т.е. внешние переменные стопа и тейка, а это i_sl и i_tp не равны нулю, тогда мы получаем цены стопа и тейка, которые будут уже в ордере, а это sl и tp. После того я проверю, вычислили мы sl и tp тут(если для шорта):

 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);      // Модифицируем ордер
      }
 

 Сначала выстройте свою логику в старте, потом делайте функции, файлы и т. п.

Зачем чесать левой рукой за правым ухом?!

 

У меня функция начинается с объявления параметров, см. у Кима!

void ModifyOrder(int ticket, double pp, double sl, double tp, datetime e, color arrow_cl) 
 
borilunad:

У меня функция начинается с объявления параметров, см. у Кима!

 


 Это мне?
 
hoz:

 Ну а логика то где? Хочется понять очень.. Есть вот функция:

  Порядок такой, если вводные т.е. внешние переменные стопа и тейка, а это i_sl и i_tp не равны нулю, тогда мы получаем цены стопа и тейка, которые будут уже в ордере, а это sl и tp. После того я проверю, вычислили мы sl и tp тут(если для шорта):

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

 А тут, я проверил нашли ли мы значения стопа и тейка. Как они могут после всех условий быть ноль?


Блин, только что заметил, не if(g_type == OP_BUY),  а   if( OrderType( ) == OP_BUY || OrderType( ) == OP_BUYSTOP || OrderType( ) == OP_BUYLIMIT ) не помню, какие ордера вы открываете
 
hoz:

 Это мне?
А кому же?
 
rigonich:

Блин, только что заметил, не if(g_type == OP_BUY),  а   if( OrderType( ) == OP_BUY || OrderType( ) == OP_BUYSTOP || OrderType( ) == OP_BUYLIMIT ) не помню, какие ордера вы открываете
У меня эта функция модифицирует все 4 типа ордеров и 2 типа позиций, больше не существует!
Причина обращения: