Ещё один не торгующий советник

 

Всем привет!

Полазил по форуму - похожие проблемы были, но конкретно моей проблемы не нашёл:

На демо-счёте не открыватся ордера. Только руками, а если советник пытается, то в журнале идёт сообщение:

2014.02.03 10:56:49 '9471448': order buy 0.10 EURUSD opening at 0.00000 sl: 0.84942 tp: 1.84942 failed [Invalid S/L or T/P].

Почему цена открытия равна нулю и в чём тут инвалидность стопов?

Текст советника простейший:

double loot;

int start()
{
int i,slip=3*MathPow(10,Digits)/10000;
loot=0.1;
i=OrderSend(Symbol(),OP_BUY,loot,Ask,slip,Bid-0.5,Bid+0.5);
return(0);
}

 
Начните с открытия позиции с нулевыми СТОПами.
 
Некоторые ДЦ запрещают открывать позиции с заданными стопами, если позиции открываются по рынку (например альпари). Можно или ставить отложки, тогда можно сразу задавать стопы, или на следующем тике модифицировать открытые позиции.
 

Да, я торгую в Альпари.

Действительно, с нулевыми стопами всё работает. Как-то глупо, но спасибо за решение.

А что значит "открываются по рынку"?

 
fizik:

Да, я торгую в Альпари.

А что значит "открываются по рынку"?


Это и значит, позиция открывается не по заявленной трейдером цене, а по ближайшей рыночной. Стопы в таком случае запрещены, их можно выставить позже.
 
fizik:

Да, я торгую в Альпари.

А что значит "открываются по рынку"?


СЛ и ТП нельзя выставить при открытии рыночного ордера, это можно сделать потом, модифицировав уже открытый ордер
 

Функции для такого исполнения приказа есть напр. в примере: https://www.mql5.com/ru/articles/1385

//+-------------------------------------------------------------------+
//| Открывает позиции в условиях рыночного исполнения торговых заявок |
//+-------------------------------------------------------------------+
int WHCOrderSend(string    symbol,
                 int       cmd,
                 double    volume,
                 double    price,
                 int       slippage,
                 double    stoploss,
                 double    takeprofit,
                 string    comment,
                 int       magic,
                 datetime  expiration,
                 color     arrow_color)
  {
   int ticket=OrderSend(symbol,cmd,volume,price,slippage,0,0,comment,magic,expiration,arrow_color);
   int check=-1;
   if(ticket>0 && (stoploss!=0 || takeprofit!=0))
     {
      if(!OrderModify(ticket,price,stoploss,takeprofit,expiration,arrow_color))
        {
         check=GetLastError();
         if(check!=ERR_NO_MQLERROR)
            Print("OrderModify error: ",ErrorDescription(check));
        }
     }
   else
     {
      check=GetLastError();
      if(check!=ERR_NO_ERROR)
         Print("OrderSend error: ",ErrorDescription(check));
     }
   return(ticket);
  }
//+------------------------------------------------------------------+

Вставляете (копируете) эту функцию в самый конец вашего кода.

задаете в парметрах

#define MAGICMA 20050610

extern int StopLoss = 500;
extern int TakeProfit = 500;

extern color BuyColor = Blue;
extern color SellColor = Salmon;

double SL=0,TP=0;

А вместо вашего i=OrderSend(Symbol(),OP_BUY,loot,Ask,slip,Bid-0.5,Bid+0.5);

- задаете


i= WHCOrderSend(Symbol(),OP_SELL,Loot,Bid, slip, SL,TP,"хи-хи", MAGICMA, 0,SellColor);

см. код по ссылке в примере

 

На скорую руку вставил вам в код, работу не проверял (работает в селл)

#define MAGICMA 20050610 
extern int StopLoss = 500;
 extern int TakeProfit = 500;
extern color BuyColor = Blue;
 extern color SellColor = Salmon; 

double loot; double SL=0,TP=0;
//-- Подключаемые модули --
#include <stderror.mqh>
#include <stdlib.mqh> 

 int start()
 {
 int i,slip=3*MathPow(10,Digits)/10000;
 loot=0.1;
 i= WHCOrderSend(Symbol(),OP_SELL,loot,Bid, slip, SL,TP,"хи-хи", MAGICMA, 0,SellColor);
 return(0);
 }



//+-------------------------------------------------------------------+
//| Открывает позиции в условиях рыночного исполнения торговых заявок |
//+-------------------------------------------------------------------+
int WHCOrderSend(string    symbol,
                 int       cmd,
                 double    volume,
                 double    price,
                 int       slippage,
                 double    stoploss,
                 double    takeprofit,
                 string    comment,
                 int       magic,
                 datetime  expiration,
                 color     arrow_color)
  {
   int ticket=OrderSend(symbol,cmd,volume,price,slippage,0,0,comment,magic,expiration,arrow_color);
   int check=-1;
   if(ticket>0 && (stoploss!=0 || takeprofit!=0))
     {
      if(!OrderModify(ticket,price,stoploss,takeprofit,expiration,arrow_color))
        {
         check=GetLastError();
         if(check!=ERR_NO_MQLERROR)
            Print("OrderModify error: ",ErrorDescription(check));
        }
     }
   else
     {
      check=GetLastError();
      if(check!=ERR_NO_ERROR)
         Print("OrderSend error: ",ErrorDescription(check));
     }
   return(ticket);
  }
//+------------------------------------------------------------------+
Файлы:
 
Спасибо.
Причина обращения: