Терминал обновился на 1983. В тестере стали лезть непонятные ошибки при создании графических объектов (создаю вертикальные линии и трендовые линии). В 1981 все было нормально.
Сейчас же получаю ошибки 4001.
Код создания:
//+------------------------------------------------------------------+//| Создаем трендовую линию на чарте |//+------------------------------------------------------------------+void DrawTrendLine(conststring id,// Строковый идентификаторconstdatetime t1, // Время первой точки линииconstdatetime t2, // Время второй точки линииconstdouble price,// Цена обеих точек линииconstcolor clr // Цвет линии
)
{
//--- Формируем имя линииconststring name=_prefix+id+TimeToString(t1)+"_"+TimeToString(t2);
//--- Сбрасываем код последней ошибкиResetLastError();
//---//Print( __FUNCTION__,": Создаем тренд-линию "+name+": t1 = "+TimeToString( t1 )+", t2 = "+TimeToString( t2 )+", price = "+DoubleToString( price ) );//--- Создаем объект, проверяем созданиеif(ObjectCreate(0,name,OBJ_TREND,0,t1,price,t2,price)) // Если объект создан
{
//--- Меняем свойства линийObjectSetInteger(0,name,OBJPROP_COLOR,clr);
ObjectSetInteger(0,name,OBJPROP_BACK,true);
ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT);
ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,false);
ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,false);
}
else// Если объект не созданPrint(__FUNCTION__,": ОШИБКА #",GetLastError(),": Объект '"+name+"' не построен! t1 = "+TimeToString(t1)+", t2 = "+TimeToString(t2)+", price = "+DoubleToString(price));
}
//+------------------------------------------------------------------+//| Создаем вертикальную линию на чарте |//+------------------------------------------------------------------+void DrawVLine( conststring id, // Строковый идентификаторconstdatetime time // Время
)
{
//--- Формируем имя линииconststring name=_prefix+id+TimeToString(time);
//--- Сбрасываем код последней ошибкиResetLastError();
//--- Создаем объект, проверяем созданиеif(ObjectCreate(0,name,OBJ_VLINE,0,time,0)) // Если объект создан
{
//--- Меняем свойства линийObjectSetInteger(0,name,OBJPROP_COLOR,_vLineClr);
ObjectSetInteger(0,name,OBJPROP_BACK,true);
ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT);
}
else// Если объект не созданPrint(__FUNCTION__,": ОШИБКА #",GetLastError(),": Объект '"+name+"' не построен! t1 = "+TimeToString(time));
}
Ошибка NormalPrice! Добрый всем денек. Переделывал обычный маргинтейл на c mql4 на mql5 выдает ошибку NormalPrice. Помогите разобраться где собака зарыта.
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>
CPositionInfo o_position; //класс для управления открытыми позициями
CTrade o_trade;
CSymbolInfo o_symbol;
COrderInfo o_order;
//+------------------------------------------------------------------+//| Переменные вводимые при запуске параметры |//+------------------------------------------------------------------+inputdouble StartLot = 0.1;
inputint Indent = 30;
inputint Step = 10;
inputdouble ProfitClose = 20;
inputint MagicNumber = 12345;
inputint Slippage = 30;
//+------------------------------------------------------------------+//| Изменяемые параметры в программе |//+------------------------------------------------------------------+int dStep;
int dIndent;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
dStep = Step;
dIndent = Indent;
if (!o_symbol.Name(Symbol()))
return(INIT_FAILED);
RefreshRates();
o_trade.SetExpertMagicNumber(MagicNumber);
//Проверка режимов открытия ордеров через функциюif (IsFillingTypeAllowed (o_symbol.Name(), SYMBOL_FILLING_FOK))
{
o_trade.SetTypeFilling(ORDER_FILLING_FOK);
}
elseif (IsFillingTypeAllowed (o_symbol.Name(), SYMBOL_FILLING_IOC))
{
o_trade.SetTypeFilling(ORDER_FILLING_IOC);
}
else
{
o_trade.SetTypeFilling(ORDER_FILLING_RETURN);
}
o_trade.SetDeviationInPoints(Slippage);
if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5)
{
dStep *= 10;
dIndent *= 10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
datetime lpos_time = 0;
double lpos_price_open = 0.0;
double lpos_volume = 0.0;
ENUM_POSITION_TYPE lpos_type = -1;
int pos_count = 0;
double sum_profit = 0;
//счечик открытых позицийfor (int i = PositionsTotal() - 1; i>=0; i--)
{
if (o_position.SelectByIndex(i))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
if (o_position.Time() > lpos_time)//если время позиции больше чем время последней позиции
{
lpos_time = o_position.Time();
lpos_price_open = o_position.PriceOpen();
lpos_volume = o_position.Volume();
lpos_type = o_position.PositionType();
}
pos_count++;
sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit();
}
}
}
//счетчик количества отложенных ордеровint stop_count = 0;
for (int i = OrdersTotal()-1; i>=0; i--) //OrderTotal считает только отложенные ордера
{
if (o_order.SelectByIndex(i))
{
if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
stop_count++;
}
}
//Функция проверки котировокif (!RefreshRates())
return;
//if (sum_profit > ProfitClose)
{
CloseAll();
return;
}
//if (pos_count>0)
{
if (lpos_type == POSITION_TYPE_BUY && o_symbol.Bid() < lpos_price_open - dStep * o_symbol.Point())
{
o_trade.Sell(lpos_volume * 2, o_symbol.Name());
}
if (lpos_type == POSITION_TYPE_SELL && o_symbol.Ask() < lpos_price_open + dStep * o_symbol.Point())
{
o_trade.Buy(lpos_volume * 2, o_symbol.Name());
}
o_trade.SellStop(StartLot, o_symbol.Bid() - dIndent * o_symbol.Point());
o_trade.BuyStop(StartLot, o_symbol.Ask() + dIndent * o_symbol.Point());
return;
}
if (pos_count > 0 && stop_count > 0)
DeleteStopOrders();
}
//Функция проверки котировокboolRefreshRates()
{
if (!o_symbol.RefreshRates())
return (false);
if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
return (false);
return(true);
}
//+------------------------------------------------------------------+bool IsFillingTypeAllowed (string symbol, int fill_type)
{
int filling = (int) SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);//запрашиваем режим открытияreturn(filling && fill_type);
}
//+------------------------------------------------------------------+void CloseAll()
{
for (int index = PositionsTotal()-1; index >=0; index--)
{
if (o_position.SelectByIndex(index))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
o_trade.PositionClose(o_position.Ticket());
}
}
}
}
//+Функция удаления стоп ордеровvoid DeleteStopOrders()
{
for (int i = OrdersTotal()-1; i>-0; i--)
{
if (o_order.SelectByIndex(i))
if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
o_trade.OrderDelete(o_order.Ticket());
}
}
Помимо указанных выше ошибок тестера (тестирую мультивалютный советник), в тестере другие символы не хотят отображаться, и в журнал попадают многочисленные ошибки отсутствия синхронизации, также под номером 4001.
Повторюсь, в билде 1981 все работало без ошибок. В 1983 - беда.
Функция проверки синхронизации:
//+------------------------------------------------------------------+//| Проверка синхронизации данных |//+------------------------------------------------------------------+bool CheckSync(conststring &usingSymbols[],// Список используемых символовconstENUM_TIMEFRAMES timeframe // Рабочий ТФ
)
{
//--- Цикл по символамfor(int i=0; i<_symbolsSize; i++)
{
//--- Проверяем синхронизацию i-го символаif(!SymbolIsSynchronized(usingSymbols[i]) || // Если нет синх. данных терминала и сервера или..
!SeriesInfoInteger(usingSymbols[i],timeframe,SERIES_SYNCHRONIZED)) // ..не синх. данные по символу/периоду на данный момент
{
//---Print(__FUNCTION__,": ВНИМАНИЕ! Синхронизация по '"+usingSymbols[i]+"' ТФ "+EnumToString(timeframe)+" отсутствует!");
Print(__FUNCTION__,": error = ",GetLastError());
//--- Возвращаем ложьreturn( false );
}
}
//--- Все символы синхронизованыreturn( true );
}
Синхронизация поддерживается ежеминутным запросом данных по каждому символу функцией CopyTime(). ResetLastError() перед вызовом функций проверки синхронизации не сбрасывает номер ошибки 4001.
Нарушается уже существующая логика.
Вот так будет интереснее
Если вызовы не менять, то коммент будет, как и раньше затираться.
Если явно передать NULL, то копируем существующий коммент
А может наоборот удобней будет
Тогда кому надо, тот затрет пустым значением. А по умолчанию будет копироваться.
Уважаемые разработчики!
Терминал обновился на 1983. В тестере стали лезть непонятные ошибки при создании графических объектов (создаю вертикальные линии и трендовые линии). В 1981 все было нормально.
Сейчас же получаю ошибки 4001.
Код создания:
Вопрос к разработчикам.
Из функции стандартной библиотеки mytrade.PositionClose(const string symbol,ulong deviation=ULONG_MAX) отсутствует параметр комментарии: const string comment=""
Это что, упущение ?
Похоже, что правильнее написать сюда:
https://www.mql5.com/ru/forum/302709#comment_10570043
Ошибка NormalPrice! Добрый всем денек. Переделывал обычный маргинтейл на c mql4 на mql5 выдает ошибку NormalPrice. Помогите разобраться где собака зарыта.
От чего строится надежность сигнала?
Вопрос может и не в тему, но и создавать просто так не вижу смысла. Задам тут.
От чего строится надежность сигнала?
Помимо указанных выше ошибок тестера (тестирую мультивалютный советник), в тестере другие символы не хотят отображаться, и в журнал попадают многочисленные ошибки отсутствия синхронизации, также под номером 4001.
Повторюсь, в билде 1981 все работало без ошибок. В 1983 - беда.
Функция проверки синхронизации:
Синхронизация поддерживается ежеминутным запросом данных по каждому символу функцией CopyTime(). ResetLastError() перед вызовом функций проверки синхронизации не сбрасывает номер ошибки 4001.