Помогите новичку с MQL5

 

Добрый день. Тренируюсь с советником. Для начала хочу научить его просто тупо входить в сделку, не получается. По коду, на первой свечке должна произойти покупка, а по факту вот такое сообщение в журнале (мусор убрал, только ошибки). Испытываю в тестере. Может проблема в том, что не идут реальные торги, сегодня выходной, хотя ведь тестер? Напротив входных переменных нужно ставить галочки, пробовал с ними и без? Может быть тестеру нужен номер демосчета ?

2016.02.27 15:32:57	History	nothing to analyze
2016.02.27 15:52:18.859	2016.02.24 09:10:00   2016.02.24 09:10:00
2016.02.27 15:52:18.855	2016.02.24 09:00:00   Ошибка открытия ордера - 4756
2016.02.27 15:52:18.855	2016.02.24 09:00:00   Код результата операции - 10016
2016.02.27 15:52:18.855	2016.02.24 09:00:00   failed market buy 1.00 USDRUB sl: 76.53645 tp: 76.53685 [Invalid stops]



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

Вот  код.

 

#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
input double Profit = 25.0;
input double StopLos = 15.0;
input double Spred = 5.0;
input double Lot = 1.0;
input int Slip = 3;//проскальзывание
/////////////////////////////////////////////////////////
double Ask;
double Bid;
bool cantrade=true;//флаг для разрешения торговли

/////////////////////////////////////////////////////////
int OpenLong()
{
MqlTradeRequest my_trade={0};
MqlTradeResult my_trade_result={0};
my_trade.action=TRADE_ACTION_DEAL;
my_trade.symbol=Symbol();
my_trade.volume=NormalizeDouble(Lot,1);
my_trade.price=NormalizeDouble(Ask,_Digits);
my_trade.sl=NormalizeDouble(Ask-StopLos*_Point,_Digits);
my_trade.tp=NormalizeDouble(Ask+Profit*_Point,_Digits);
my_trade.deviation=Slip;
my_trade.type=ORDER_TYPE_BUY;//ПОКУПАЕМ
my_trade.type_filling=ORDER_FILLING_FOK;

ResetLastError();
if(OrderSend(my_trade,my_trade_result))
{
Print("Код результата операции- ",my_trade_result.retcode);
}
else
{
Print("Код результата операции - ",my_trade_result.retcode);
Print("Ошибка открытия ордера - ",GetLastError());
}
return(0);
}



////////////////////////////////////////////////////////
int OpenShort()
{
MqlTradeRequest my_trade={0};
MqlTradeResult my_trade_result={0};
my_trade.action=TRADE_ACTION_DEAL;
my_trade.symbol=Symbol();
my_trade.volume=NormalizeDouble(Lot,1);
my_trade.price=NormalizeDouble(Bid,_Digits);
my_trade.sl=NormalizeDouble(Bid-StopLos*_Point,_Digits);
my_trade.tp=NormalizeDouble(Bid+Profit*_Point,_Digits);
my_trade.deviation=Slip;
my_trade.type=ORDER_TYPE_SELL;//ПРОДАЁМ
my_trade.type_filling=ORDER_FILLING_FOK;

ResetLastError();
if(OrderSend(my_trade,my_trade_result))
{
Print("Код результата операции- ",my_trade_result.retcode);
}
else
{
Print("Код результата операции - ",my_trade_result.retcode);
Print("Ошибка открытия ордера - ",GetLastError());
}

return(0);
}




/////////////////////////////////////////////////////////

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

   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
datetime dt; //время для сделок
dt = TimeCurrent();//время поступления котировки
Print(dt);  
MqlTick last_tick;
SymbolInfoTick(_Symbol,last_tick);
Ask=last_tick.ask;
Bid=last_tick.bid;
if (cantrade==true)
{
OpenLong();
}
cantrade=false;
//Print("Ask - ",Ask, Bid);


 
  }
Так, нашел что код вот что 

10016

TRADE_RETCODE_INVALID_STOPS

Неправильные стопы в запросе

 

10016

TRADE_RETCODE_INVALID_STOPS

Неправильные стопы в запросе

И сразу по стилю написания: располагайте функции в общепринятом порядке, а также пользуйтесь стилизатором кода.

Вот так будет красивее:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
input double Profit=25.0;
input double StopLos=30.0;
input double Spred=5.0;
input double Lot=1.0;
input int Slip=3;//проскальзывание
//---
double Ask;
double Bid;
bool cantrade=true;//флаг для разрешения торговли
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   Print("Минимальный отступ в пунктах от текущей цены закрытия для установки Stop ордеров =",
         SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL));
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OpenLong()
  {
   MqlTradeRequest my_trade={0};
   MqlTradeResult my_trade_result={0};
   my_trade.action=TRADE_ACTION_DEAL;
   my_trade.symbol=Symbol();
   my_trade.volume=NormalizeDouble(Lot,1);
   my_trade.price=NormalizeDouble(Ask,_Digits);
   my_trade.sl=NormalizeDouble(Bid-50*Point(),Digits());
   my_trade.tp=NormalizeDouble(Ask+50*Point(),Digits());
   my_trade.deviation=Slip;
   my_trade.type=ORDER_TYPE_BUY;//ПОКУПАЕМ
   my_trade.type_filling=ORDER_FILLING_FOK;

   ResetLastError();
   if(OrderSend(my_trade,my_trade_result))
     {
      Print("Код результата операции- ",my_trade_result.retcode);
     }
   else
     {
      Print("Код результата операции - ",my_trade_result.retcode);
      Print("Ошибка открытия ордера - ",GetLastError());
     }
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   datetime dt; //время для сделок
   dt=TimeCurrent();//время поступления котировки
   Print(dt);
   MqlTick last_tick;
   SymbolInfoTick(Symbol(),last_tick);
   Ask=last_tick.ask;
   Bid=last_tick.bid;
   if(cantrade==true)
     {
      OpenLong();
     }
   cantrade=false;
//Print("Ask - ",Ask, Bid);
  }
//+------------------------------------------------------------------+

 

Обратите внимание на функцию OnInit(). А также всегда смотрите на обе цены: Bid и Ask - вдруг Вы тестируете на периоде, когда огромный спред.

 
Karputov Vladimir:

10016

TRADE_RETCODE_INVALID_STOPS

Неправильные стопы в запросе

И сразу по стилю написания: располагайте функции в общепринятом порядке, а также пользуйтесь стилизатором кода.

Вот так будет красивее:

 

Обратите внимание на функцию OnInit(). А также всегда смотрите на обе цены: Bid и Ask - вдруг Вы тестируете на периоде, когда огромный спред.

Спасибо, заработало. Теперь другая ошибка

2016.02.27 16:49:51.138 2016.02.24 09:00:00   Код результата операции - 10019
2016.02.27 16:49:51.138 2016.02.24 09:00:00   not enough money [market buy 1.00 USDRUB sl: 76.50610 tp: 76.53710]
2016.02.27 16:49:51.138 new. account state: Assets: 0.00, Liabilities: 0.00, Equity 10000.00, Margin: 300000.00, FreeMargin: -290000.00
2016.02.27 16:49:51.138 prev. account state: Balance: 10000.00, Credit: 0.00, Commission: 0.00, Accumulated: 0.00, Assets: 0.00, Liabilities: 0.00, Equity 10000.00, Margin: 0.00, FreeMargin: 10000.00

 

10019

TRADE_RETCODE_NO_MONEY

Нет достаточных денежных средств для выполнения запроса

Т.е. если у меня на демосчете 10000 USD, а я хочу купить, то нужно сначала продать?  А еще объясните пож чем отличается Ask от Bid. В учебнике это текущая цена. Что за цена открытия, закрытия, текущая, на одной свече или что то другое имеется ввиду?

 
g_Hab:

Спасибо, заработало. Теперь другая ошибка

 

10019

TRADE_RETCODE_NO_MONEY

Нет достаточных денежных средств для выполнения запроса

Т.е. если у меня на демосчете 10000 USD, а я хочу купить, то нужно сначала продать?  

Если мало денег, то уменьшите размер лота (у Вас он сейчас равен 1.0 - поставьте 0.01).
 
Добрый день. Опять вопрос. Мне нужно, чтобы советник после закрытия позиции 10 минут покурил, затем снова начал искать точку входа. Это сделать с помощью функции sleep? Если да, то куда ее ставить, в тело OnTick? 
 
g_Hab:
Добрый день. Опять вопрос. Мне нужно, чтобы советник после закрытия позиции 10 минут покурил, затем снова начал искать точку входа. Это сделать с помощью функции sleep? Если да, то куда ее ставить, в тело OnTick? 
ИМХО, лучше записать время закрытия в глобальную переменную и проверять в OnTick >Т+10. Только делать не по реалтайм, а по свече.
 
подскажите пожайлуста. могу ли я как то деньги со счета mql5 перевести на торговый счет???????
 
angel0103 moshkov:
подскажите пожайлуста. могу ли я как то деньги со счета mql5 перевести на торговый счет???????
Нет.
 
Yuriy Asaulenko:
ИМХО, лучше записать время закрытия в глобальную переменную и проверять в OnTick >Т+10. Только делать не по реалтайм, а по свече.

Вот, что я придумал, но не уверен что правильно ( Мне нужно, чтобы советник после закрытия позиции 6 минут покурил, затем снова начал искать точку входа. Это сделать с помощью функции sleep? Если да, то куда ее ставить, в тело OnTick? .) Привожу кусок кода вставленный в тело OnTick. Изначально флаг poz описан в глобальных переменных как true. Далее выставляется ордер и флаг poz переключается в false. Затем (последнее условие в коде), каждый тик проверяется отсутствие открытых позиций, когда такой момент настает, значит сделка закрылась и идет выдержка времени sleep 6 минут, после чего poz переводится в true и разрешает советнику торговать. Компилятор ошибок не дает, но сомнения остаются т.к. OnTick выполняется каждый тик, а внутри него 6 минут!? Посмотрите пожалуйста и наставьте на путь истинный, заранее спасибо.

if(cenamin1<cenamin3-Dob && cenamin1<cenamax4-Dob && fl2==true && poz==true)
     {
      // есть ли в данный момент открытая позиция на продажу?
      if(!Sell_opened && !Buy_opened)
        {
         //Alert("Уже есть позиция на продажу или покупку!!!");
         //return;    // не добавлять к открытой позиции на продажу
         OpenShort();
         //fl2=false;
         poz=false;
         // Sleep(6000000);
        }

      //  ObjectCreate(0,"HLine1",OBJ_HLINE,0,0,0);

     }
   if(poz==false)
     {
      if(!Sell_opened && !Buy_opened)
        {
        Sleep(6000000);
        poz=true;
        }
     }

  }
 
Проверил, не работает( Хорошо, как узнать время закрытия сделки?
 
Ищите в истории самую последнюю сделку с типом состояния DEAL_ENTRY_OUT, от её времени исполнения отмеряйте нужный интервал времени.
Причина обращения: