Скачать MetaTrader 5

Ошибки, баги, вопросы

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Поиск в документации доступен через MetaTrader 5. Ищи и изучай!
ddd06
390
ddd06 2010.06.02 11:00 
Ошибка после команды CopyClose
#include <Trade\Trade.mqh>
double Arr1[],Arr2[];
int OnInit()
  {
   ArraySetAsSeries(Arr1,true);
   ArraySetAsSeries(Arr2,true);
   return(0);
  }

void OnTick()
  {
   CopyClose("EURUSD",PERIOD_CURRENT, 0, 50, Arr1);
   //CopyClose("GBPUSD",PERIOD_CURRENT, 0, 50, Arr2);
   CTrade trade;
   trade.PositionOpen("EURUSD",ORDER_TYPE_SELL,1, SymbolInfoDouble("EURUSD",ORDER_TYPE_SELL==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK),0,0); 
   trade.PositionOpen("GBPUSD",ORDER_TYPE_SELL,1, SymbolInfoDouble("GBPUSD",ORDER_TYPE_SELL==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK),0,0); 
  }

Запускаем тестер на паре EURUSD, все работает, оба ордера отправляются. Если раскомментировать строчку, то ордер по GBPUSD не открывается и в логе ошибка:

2010.06.02 10:34:26 Core 1 failed instant sell 1.00 GBPUSD at 0.00000 [Invalid stops]
2010.06.02 10:34:26 Core 1 No prices for symbol GBPUSD

Попробовал через SymbolInfoTick, тоже самое.

И не подскажете как правильнее через  SymbolInfoTick или SymbolInfoDouble?

ddd06
390
ddd06 2010.06.02 18:52  

OrdersTotal возвращает 0

#include <Trade\Trade.mqh>
CTrade trade;
int gi_flag=1;
void OnTick()
  {
   if(gi_flag==1)
   {
   trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,1, SymbolInfoDouble(_Symbol,ORDER_TYPE_SELL==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK),0,0);
   gi_flag=0;
   }
   PrintFormat(DoubleToString(OrdersTotal(),1));
  }

Хотя как я понимаю должен вернуть 1, или я не правильно понимаю?

Rashid Umarov
Админ
11812
Rashid Umarov 2010.06.02 22:52  
Ордера - это не позиции. Ордер - это еще не исполненный приказ на открытие позиции, позиция - результат выполнения ордера.
ddd06
390
ddd06 2010.06.03 07:42  
Rosh:
Ордера - это не позиции. Ордер - это еще не исполненный приказ на открытие позиции, позиция - результат выполнения ордера.

Спасибо, понятно, значит будем пользоваться функцией PositionsTotal.

А что с первой проблемой? 

Sergey Gritsay
6457
Sergey Gritsay 2010.06.04 11:11  

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

string  Data()
{
   string vr;
   string den;
   datetime date=TimeCurrent();
   MqlDateTime str;
   TimeToStruct(date,str);
   switch(str.day_of_week)
   {
    case 0: den = "Воскресенье";
    case 1: den = "Понедельник";
    case 2: den = "Вторник";
    case 3: den = "Среда";
    case 4: den = "Четверг";
    case 5: den = "Пятница";
    case 6: den = "Суббота";
   }
   printf("%02d.%02d.%4d %02d:%02d:%02d %d",str.day,str.mon,str.year,str.hour,str.min,str.sec,str.day_of_week);
   printf("%02d.%02d.%4d %02d:%02d:%02d %s",str.day,str.mon,str.year,str.hour,str.min,str.sec,den);
   return(StringFormat("%02d.%02d.%4d %02d:%02d:%02d %s",str.day,str.mon,str.year,str.hour,str.min,str.sec,den));
}

в лог печатает такие результаты

MF    0    11:06:34    04.06.2010 09:06:43 5

RN    0    11:06:34    04.06.2010 09:06:43 Суббота

на сколько я знаю 5 день это пятница.

Slawa
Модератор
6839
Slawa 2010.06.04 11:46  
sergey1294:

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

в лог печатает такие результаты

MF    0    11:06:34    04.06.2010 09:06:43 5

RN    0    11:06:34    04.06.2010 09:06:43 Суббота

на сколько я знаю 5 день это пятница.

 

При любом значении day_of_week Вы будете получать значение "Суббота". Потому что отсутствуют операторы break между case
Sergey Gritsay
6457
Sergey Gritsay 2010.06.04 12:14  
stringo:
При любом значении day_of_week Вы будете получать значение "Суббота". Потому что отсутствуют операторы break между case
спасибо, совсем забыл про них
ddd06
390
ddd06 2010.06.04 18:12  

Еще 2 непонятных момента 

void OnTick()
  {    
   for(int li=1; li<2; li++)
   {
      PrintFormat(SymbolName(li,true));      
   }
  }

 Возвращает пустоту или пробел, но не название символа

void OnTick()
  {
   PrintFormat(DoubleToString(SymbolsTotal(true),1));
  }

Возвращает 1 хотя у меня открыто не меньше 10

Но если поставить не  true а false, то все вроде работает нормально

Vladimir Batrudinov
4924
Vladimir Batrudinov 2010.06.04 18:35  
ddd06:

 Возвращает пустоту или пробел, но не название символа


  for(int li=0; li<SymbolsTotal(false); li++)
  {
  PrintFormat(SymbolName(li,false));
  }
Так наверно будет правильней, если нужно перебрать все что есть в ДЦ. если только то что в терминале в таблице, то меняем false на true.
ddd06
390
ddd06 2010.06.04 20:15  

Так про то и речь, что с true не работает!

 

Vladimir Batrudinov
4924
Vladimir Batrudinov 2010.06.04 20:21  
ddd06:

Так про то и речь, что с true не работает!

Это работает, проверено на трех ДЦ (перебор всех инструментов которые торгуются в ДЦ)

  for(int li=0; li<SymbolsTotal(false); li++)
  {
  PrintFormat(SymbolName(li,false));
  }

А вот этот код переберет все что в окне "Обзор рынка" выбрано

  for(int li=0; li<SymbolsTotal(true); li++)
  {
  PrintFormat(SymbolName(li,true));
  }

Только я тут вот что не пойму. Зачем такой перебор делать в OnTick().

12345678...1856
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий