Блог им. gagarin

Ребята помогите с МТ5

    • 09 августа 2017, 11:41
    • |
    • gagarin
  • Еще
Всем добрый день. Помогите пожалуйста разобраться с МТ5. Робот на реальном счете торгует как положено и без нареканий. Но когда начинаю прогонять через тестер стратегий то ничего не показывает. Что делать? ПОМОГИТЕ.
Ребята помогите с МТ5


42 | ★2
29 комментариев
Надо смотреть что у вас там в инициализации
avatar
Андрей К, Подскажите пожалуйста как и где посмотреть?
avatar
gagarin, Открыть код робота, и смотреть функцию OnInit.
Но раз вы не программист, вы сами точно не справитесь.

Наверняка там какие то индикаторы пытаются открыться и не могут
avatar
Андрей К, вот весь код

enum ENUM_SIGNAL
{
SHORT = -1,
NONE = 0,
LONG = 1
};

// inputs
sinput string i_sMA1Settings = "=== Параметры МА1 ==="; // 
input uint i_nMA1Period = 10; // Период
input ENUM_MA_METHOD i_eMA1Method = MODE_SMA; // Тип
input ENUM_APPLIED_PRICE i_eMA1Price = PRICE_CLOSE; // Цена для расчёта

sinput string i_sSeparator1 = ""; // 
sinput string i_sMA2Settings = "=== Параметры МА2 ==="; // 
input uint i_nMA2Period = 20; // Период
input ENUM_MA_METHOD i_eMA2Method = MODE_SMA; // Тип
input ENUM_APPLIED_PRICE i_eMA2Price = PRICE_CLOSE; // Цена для расчёта

sinput string i_sSeparator2 = ""; // 
sinput string i_sEASettings = "=== Параметры советника ==="; // 
input double i_fLot = 0.1; // Лот
input int i_nMagic = 3245; // Идентификатор (Magic Number)

// globals
int g_hMA1Handle = 0;
int g_hMA2Handle = 0;

double g_fMA1[];
double g_fMA2[];

CTrade g_oTrade;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(i_nMA1Period == 0 || i_nMA2Period == 0 || i_nMA1Period > i_nMA2Period)
{
string sErr = «Периоды обеих МА должны быть больше нуля, и период МА1 должен быть меньше периода МА2. \nОткорректируйте введённые значения.»;
MessageBox(sErr, «Некорректные параметры!»);
Print(sErr);
return(INIT_FAILED);
}

g_hMA1Handle = iMA(Symbol(), Period(), i_nMA1Period, 0, i_eMA1Method, i_eMA1Price);
g_hMA2Handle = iMA(Symbol(), Period(), i_nMA2Period, 0, i_eMA2Method, i_eMA2Price);

ArrayResize(g_fMA1, 3);
ArrayResize(g_fMA2, 3);

ZeroMemory(g_fMA1);
ZeroMemory(g_fMA2);

ArraySetAsSeries(g_fMA1, true);
ArraySetAsSeries(g_fMA2, true);

g_oTrade.SetDeviationInPoints(200);
g_oTrade.SetExpertMagicNumber(i_nMagic);
g_oTrade.SetTypeFilling(OrderTypeFilling(Symbol()));

NewBar(0, true);

return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
datetime dtTime[1];
CopyTime(Symbol(), Period(), 0, 1, dtTime);

// совершаем сделки только на опен бара
if(NewBar(dtTime[0]) == true)
{
// копируем значения мувингов
CopyBuffer(g_hMA1Handle, 0, 0, 3, g_fMA1);
CopyBuffer(g_hMA2Handle, 0, 0, 3, g_fMA2);

// вычисляем сигнал (пересечение мувингов)
ENUM_SIGNAL eSignal = NONE;

if(g_fMA1[1] > g_fMA2[1] && g_fMA1[2] <= g_fMA2[2])
eSignal = LONG;
else if(g_fMA1[1] < g_fMA2[1] && g_fMA1[2] >= g_fMA2[2])
eSignal = SHORT;

if(eSignal == NONE)
return;

// проверяем, есть ли уже открытая сделка
bool bBuyIsOpen = false;
bool bSellIsOpen = false;

if(PositionSelect(Symbol()) == true)
{
if(HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER)) == true)
{
ulong nLastDealTicket = 0;

for(int i = 0; i < HistoryDealsTotal(); i++)
{
ulong nDealTicket = HistoryDealGetTicket(i);

if(HistoryDealGetInteger(nDealTicket, DEAL_MAGIC) == i_nMagic && nDealTicket > nLastDealTicket)
{
if(HistoryDealGetInteger(nDealTicket, DEAL_TYPE) == DEAL_TYPE_BUY)
{
bBuyIsOpen = true;
bSellIsOpen = false;
}
else if(HistoryDealGetInteger(nDealTicket, DEAL_TYPE) == DEAL_TYPE_SELL)
{
bBuyIsOpen = false;
bSellIsOpen = true;
}
else continue;

nLastDealTicket = nDealTicket;
}
}
}
}

// сигнал на покупку, и нет открытой покупки
if(eSignal == LONG && bBuyIsOpen == false)
{
double fLot = i_fLot;

// если открыт шорт — переворачиваем позицию (покупаем удвоенным лотом)
if(bSellIsOpen == true)
fLot *= 2;

MqlTick oTick;
ZeroMemory(oTick);
SymbolInfoTick(Symbol(), oTick);

// покупаем
if(g_oTrade.Buy(fLot, Symbol(), oTick.ask) == true && g_oTrade.ResultOrder() > 0)
{
// дожидаемся результата сделки
WaitForOrderInHistory(g_oTrade.ResultOrder());
}
}

// сигнал на продажу, и нет открытой продажи
if(eSignal == SHORT && bSellIsOpen == false)
{
double fLot = i_fLot;

// если открыт шорт — переворачиваем позицию (покупаем удвоенным лотом)
if(bBuyIsOpen == true)
fLot *= 2;

MqlTick oTick;
ZeroMemory(oTick);
SymbolInfoTick(Symbol(), oTick);

// продаём
if(g_oTrade.Sell(fLot, Symbol(), oTick.bid) == true && g_oTrade.ResultOrder() > 0)
{
// дожидаемся результата сделки
WaitForOrderInHistory(g_oTrade.ResultOrder());
}
}
}
}

//+------------------------------------------------------------------+

bool NewBar(const datetime dtTime, const bool bReset = false)
{
bool bRetVal = false;

static datetime s_dtLastBarTime = 0;

if(bReset == true)
{
s_dtLastBarTime = 0;
return(false);
}

if(dtTime > s_dtLastBarTime && s_dtLastBarTime > 0)
bRetVal = true;

s_dtLastBarTime = dtTime;

return(bRetVal);
}

//+------------------------------------------------------------------+

// разрешённый тип заливки ордеров
ENUM_ORDER_TYPE_FILLING OrderTypeFilling(const string sSymbol)
{
ENUM_ORDER_TYPE_FILLING eRetVal;

int nFillingFlags = (int)SymbolInfoInteger(sSymbol, SYMBOL_FILLING_MODE);

if((nFillingFlags & SYMBOL_FILLING_FOK) == SYMBOL_FILLING_FOK)
eRetVal = ORDER_FILLING_FOK;
else if((nFillingFlags & SYMBOL_FILLING_IOC) == SYMBOL_FILLING_IOC)
eRetVal = ORDER_FILLING_IOC;
else
eRetVal = ORDER_FILLING_RETURN;

return(eRetVal);
}

//+------------------------------------------------------------------+

void WaitForOrderInHistory(ulong nResultOrder)
{
if(nResultOrder > 0)
{
// дождёмся появления ордера nResultOrder в истории
while(!IsStopped())
{
if(HistoryOrderSelect(nResultOrder) == true)
break;

Sleep(10);
}
}
}

//+------------------------------------------------------------------+

avatar
Андрей К, Робот до этого месяца нормально тестировался а в начале месяца бац и тишина. В роботе ничего не делали.
avatar
У Вас там в коде написано
«Периоды обеих МА должны быть больше нуля, и период МА1 должен быть меньше периода МА2. 
может в этом всё дело?
avatar
qwerty, Я все делал. всеровно такие ошибки выдает.
avatar
В OnInit вставляйте печать лога. Чтобы отловить где вылетает.
После каждой строчки.
Например:
g_hMA1Handle = iMA(Symbol(), Period(), i_nMA1Period, 0, i_eMA1Method, i_eMA1Price);

Print («Сделал g_hMA1Handle»)

g_hMA2Handle = iMA(Symbol(), Period(), i_nMA2Period, 0, i_eMA2Method, i_eMA2Price);

Print («Сделал g_hMA2Handle»)

ArrayResize(g_fMA1, 3);

Print («Сделал ArrayResize(g_fMA1»)

ArrayResize(g_fMA2, 3);

Print («Сделал ArrayResize(g_fMA2»)

как локализуете ошибку, будем думать. 
avatar
Андрей К, 

avatar
gagarin, вы там примените другие ковычки, это Смартлаб заменил.
не такие <<, а такие "
avatar
Андрей К, 

avatar
gagarin, после Print, точку с запятой
avatar
Андрей К, 

avatar
gagarin, прошу прощение, я наверное должен писать более подробно.
Не конкретно после Print, а каждая строчка должна заканчиваться точкой с запятой. Как это сделано везде.
avatar
Андрей К, Это вы меня извините за назойливость и за трату вашего времени



avatar
gagarin, 
вот так надо:
Print («какой то текст»);

только ковычки "
avatar
Андрей К, 

avatar
Андрей К, 

avatar
gagarin, я правильно понял, что начал торговать на тестере?
avatar
Андрей К, Да на тестере 1 сделку сделал и все. В реале он торгует без проблем.
avatar
Андрей К, 

avatar
Андрей К, сделал, открывает 1 сделку и все встает мертво
avatar
Андрей К, 

avatar
А это на скрине у вас журнал эксперта? По моему нет.
avatar
Уже не первый раз встречаю такое от пользователей и писателей на мт5, что как ни патч, то некоторые роботы ломаются (в том числе и на реал.торговле). И так постоянно. Специально вносятся такие правки, чтобы усложнить людям жизнь, чтобы побольше и почаще хомячков загонять в их фирменный маркет.
avatar
qlewer, По сути робот очень простой. Но без отладки толку нету. а с отладкой более 200% в год делает. И причем на реальном счете.
avatar
gagarin, при попытке скомпилировать выходит много ошибок, надо наверное с этого начать
avatar
блент, дык в коде же все и написано — если один из входных параметров будет 0, то инициализации не получится. Просто надо крутить оптимизатор без нулей в МА-периодах, и период первой должен быть меньше второй.

Или, вероятно, диапазоны значений оптимизации указаны так, что период первой часто\всегда больше второй.
avatar
Adept, я ставлю период первой МА меньше второй МА и они оба больше нуля и без оптимизаций всеровно открывает 1 сделку и все замирает тестер стратегии
avatar

Читайте на SMART-LAB:
5 идей в российских акциях. Индекс МосБиржи снова на грани 2700
Индекс МосБиржи опять торгуется на грани значимого уровня 2700 п. Сейчас не исключен очередной отскок от указанного уровня. Кроме того, рынок...
Фото
USD/JPY: пара возобновила рост на фоне японской неопределенности
Японская йена с началом нового года продолжила свое снижение после долгого периода консолидации, достигнув новых локальных экстремумов. Одним из...
Фото
Война чипов. К чему ведет технологическое противостояние США, Европы и Китая?
Главное Западные страны усиливают ограничения на поставки передовых чипов и технологического оборудования в Китай. Китай активно...
Фото
Хэдхантер. Ситуация на рынке труда в декабре идет ко дну - хуже не было никогда
Вышла статистика рынка труда за декабрь 2025 года, которую Хедхантер публикует ежемесячно, что же там интересного: Динамика...

теги блога gagarin

....все тэги



UPDONW
Новый дизайн