Ошибки, баги, вопросы - страница 803

 
Karlson:
Разные сервера,разные 500 пп.
Причем здесь разные сервера? Это 2 теста одного и того же человека. Отличается только валютная пара, указанная в тестере
 
ilunga:
Причем здесь разные сервера? Это 2 теста одного и того же человека. Отличается только валютная пара, указанная в тестере
Обновите терминал/тестер и может быть все заработает, к меня 687 билд и все работает.
 
fyords:

У меня все верно, сервер демо МК. 

Тогда объясните пожалуйста что за величина указана в скобках при открытии ордера и почему в одном случае она (1.29565 / 1.29654), а в другом (1.29443 / 1.29479 / 1.29443)

(Я про ваши результаты тестирования

fyords:
Обновите терминал/тестер и может быть все заработает, к меня 687 билд и все работает.

Точно такая же ошибка "вылезает" при отправке советника на чемпионат (в их автоматических тестах), поэтому обновление поможет только частично


Более того. Вылезает она только 1 раз (самая первая попытка выставления ордера не по "своей" валютной паре)

 
ilunga:
Причем здесь разные сервера? Это 2 теста одного и того же человека. Отличается только валютная пара, указанная в тестере

Посмотрите статьи про тестер:

Цены не обязаны совпадать при тестировании на другой валютной паре

 
Rosh:

Посмотрите статьи про тестер:

Цены не обязаны совпадать при тестировании на другой валютной паре

Итак, провел еще несколько тестов. Действительно проблема с "текущей ценой".

Код:

#include <Trade\SymbolInfo.mqh>
#include <Trade\Trade.mqh>

CSymbolInfo       m_sym;
CTrade            m_trade;

double bar_info[2];
bool a;

int OnInit()
{
   SymbolSelect("EURUSD", true);
   SymbolSelect("GBPUSD", true);
   m_sym.Name("EURUSD");
   a = false;
   return(0);
}

void OnTick()
{
   if (a) return;
   a = true;
   m_sym.Refresh();
   m_sym.RefreshRates();
   CopyHigh("EURUSD", PERIOD_D1, 0, 2, bar_info);
   Print("Текущая цена Ask:" + DoubleToString(m_sym.Ask()));
   Print("Текущая цена Bid:" + DoubleToString(m_sym.Bid()));
   Print("Цена открытия:" + DoubleToString(bar_info[1] + 5000*_Point));
   BUY_pending("EURUSD");
   Print("Текущая цена Ask:" + DoubleToString(m_sym.Ask()));
   Print("Текущая цена Bid:" + DoubleToString(m_sym.Bid()));
}

uint BUY_pending(string symbol)
{
   CopyHigh(symbol, PERIOD_D1, 0, 2, bar_info);
   // готовим запрос
   MqlTradeRequest request = {0};
   ZeroMemory(request);
   request.action = TRADE_ACTION_PENDING;
   request.magic  = 0;
   request.symbol = symbol;
   request.volume = 1;
   request.price  = m_sym.Ask() + 1;
   request.sl     = 0;
   request.tp     = 0;
   request.deviation = 10;
   request.type   = ORDER_TYPE_BUY_STOP; 
   request.type_filling = ORDER_FILLING_FOK;
   MqlTradeResult result;
   OrderSend(request,result);
   Print(IntegerToString(result.retcode));
   return (result.retcode);
}

Обратите внимание, открываюсь по цене Ask символа плюс 1 (с огромным запасом). При этом до и после принтую текущий Ask и Bid


Результаты (при тесте на GBPUSD):

GR      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Ask:1.29241000
LH      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Bid:1.29220000
QL      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Цена открытия:1.34220000
GD      0       Trade   11:49:40        2012.01.02 09:00:00   buy stop 1.00 EURUSD at 2.29241 (1.29709 / 1.29722)
IG      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   10009
CP      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Ask:1.29241000
HG      0       test (GBPUSD,H1)        11:49:40        2012.01.02 09:00:00   Текущая цена Bid:1.29220000

До и после выставления ордера пишется цена 1.29241. При этом в скобках (при выставлении ордера) цена 1.29722. КАК? Или я неверно получаю текущую цену? тогда как мне ее узнать?


И во-вторых, если была ошибка с ценой, то почему ошибка 10016 (стопы)?

 
ilunga:

Но в урезанном ошибка все еще существует.

Если честно, не совсем понимаю как может быть ошибка 10016 в случае отсутствия стопов

ну не знаю что и как вы там творите, проблема скорей всего действительно в SL.

Мой вариант работает без проблем. Вызов правда правда перебросил в блок инициализации, чтобы с проверками не парится (хотя наличие ордера перед установкой проверить стоило бы).

bool BUY_pending(string symbol,ENUM_TIMEFRAMES period,double volume,ulong magic = 0)
{
//----------------------------------------------------------------------------//
//Work variables
double price = 0, sl = 0, tp = 0; //Prices: Open, Sell stop, Take profit
int ResCopy = -1; //Result of copying the data into an array
int Dig     = 0;  //Digits

bool Result = true; //Returned importance
//----------------------------------------------------------------------------//

ResetLastError();

//Checking the signal to stopping the trading system
  if(IsStopped()) return(false);
//Preparation of structures
ZeroMemory(TradeRequest);
ZeroMemory(TradeResult);
ZeroMemory(CheckResult);
//Copying the data into an array
ResCopy = CopyHigh(symbol,period,0,2,bar_info);

  if(ResCopy==-1)return(false); 
//Calculations
Dig   = (int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);

price = NormalizeDouble(bar_info[1] + 500*_Point,Dig);
sl    = NormalizeDouble(price - 200*_Point,Dig);
tp    = NormalizeDouble(price + 1000*_Point,Dig);
//Preparation of request
TradeRequest.type_filling = ORDER_FILLING_FOK;
TradeRequest.action       = TRADE_ACTION_PENDING;
TradeRequest.type         = ORDER_TYPE_BUY_STOP; 
TradeRequest.deviation    = 10;
TradeRequest.symbol = symbol;
TradeRequest.magic  = magic;
TradeRequest.volume = volume;
TradeRequest.price  = price;
TradeRequest.sl     = sl;
TradeRequest.tp     = tp;
//Checking
Result = OrderCheck(TradeRequest,CheckResult);
  if((!Result)||(CheckResult.retcode!=0))return(false);
//OrderSend
Result = OrderSend(TradeRequest,TradeResult);
//Checking for presence of the errors
  if(_LastError!=0){Result = false;}
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}
Файлы:
 
Interesting:

ну не знаю что и как вы там творите, проблема скорей всего действительно в SL.

Мой вариант работает без проблем. Вызов правда правда перебросил в блок инициализации, чтобы с проверками не парится (хотя наличие ордера перед установкой проверить стоило бы).

Небольшая просьба. Можете подправить код, чтобы он перед OrderSend выводит текущую цену по тому инструменту на котором мы открываемся?
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 
ilunga:
Небольшая просьба. Можете подправить код, чтобы он перед OrderSend выводит текущую цену по тому инструменту на котором мы открываемся?

Попробуйте так:

   MqlTradeResult result;
   if(!OrderSend(request,result))
     {
      PrintFormat("retcode=%d price=%G  Ask=%G  Bid=%G Comment=%s",
                  result.retcode,result.price,result.ask,result.bid,result.comment);
      //---
      PrintFormat("%s %s at %G Ask=%G  Bid=%G  ",
                  EnumToString(request.type),symbol,request.price,SymbolInfoDouble(symbol,SYMBOL_ASK),
                  SymbolInfoDouble(symbol,SYMBOL_BID));
      Print("------------");
     }
 
ilunga:
Небольшая просьба. Можете подправить код, чтобы он перед OrderSend выводит текущую цену по тому инструменту на котором мы открываемся?

Спринцовку цены? Не вижу в этом необходимости, можно добавить сообщение об удачной/неудачной проверке и установке ордера.

В принципе это можете сделать и вы сами, должно быть не сложно (по идеи).

Rosh:

Попробуйте так:

Для отладки вполне сгодится, в рабочем коде будет излишним (по крайней мере немного корявым решением)

И распринтовку лучше ставить после OrderCheck, так чтобы в случае ошибки до OrderSend дело не дошло.

PS

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

 
Interesting:

Спринцовку цены? Не вижу в этом необходимости, можно добавить сообщение об удачной/неудачной проверке и установке ордера.

В принципе это можете сделать и вы сами, должно быть не сложно (по идеи).

Для отладки вполне сгодится, в рабочем коде будет излишним (по крайней мере немного корявым решением)

И распринтовку лучше ставить после OrderCheck, так чтобы в случае ошибки до OrderSend дело не дошло.

PS

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

Забавно. В вашем примере убрал BUYSTOP открывающийся по фунту, оставил только EURUSD.

После заполнения полей запроса вывожу цену отложенного ордера.

1) Ваш вариант - отложенный ордер ставится в ините

2012.01.01 00:00:00   price = 1.30487000

2) закомментировал в ините, перенес в OnTick. Поставил условие, чтобы срабатывало только на первом тике.

2012.01.02 09:00:00   price = 1.29720000


P.S. Я правильно понимаю, что в моем (и вашем) коде bar_info[1] - это максимум текущего бара?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
Причина обращения: