Помогите пожалуйста с советником для МТ5

 

Суть в том что робот на реале торгует без проблем. А когда прогоняешь в тестере стратегий то в тестере робот открывает 1 сделку и зависает. Раньше робот в тестере стратегий все показывал и оптимизация проходила а сейчас зависает.

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

//|                                               MA Crossing EA.mq5 |

//|                                                Sergey Vladimirov |

//|        https://login.mql5.com/ru/users/Sergey_Mechanic/portfolio |

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

#property copyright "Sergey Vladimirov"

#property link      "https://login.mql5.com/ru/users/Sergey_Mechanic/portfolio"

#property version   "1.20"


#include <Trade/Trade.mqh>


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 = 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);

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");


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);

}

}

}


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





Ребята помогите пожалуйста.

 
Kudrev:  Ребята помогите пожалуйста.

к автору пробовали обратиться?

 
Kudrev:

...


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

 

извините. вот как положено

//+------------------------------------------------------------------+
//|                                               MA Crossing EA.mq5 |
//|                                                Sergey Vladimirov |
//|        https://login.mql5.com/ru/users/Sergey_Mechanic/portfolio |
//+------------------------------------------------------------------+
#property copyright "Sergey Vladimirov"
#property link      "https://login.mql5.com/ru/users/Sergey_Mechanic/portfolio"
#property version   "1.20"

#include <Trade/Trade.mqh>

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);
                }
        }
}

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

Какой тип счёта: неттинг или хедж? Какой символ, таймфрейм, исторический период и какой тип генерации тиков?

Какой билд терминала и название и битность операционной системы?
 
Kudrev:

извините. вот как положено

Там в самом начале кода есть 2 строчки, сигнала нет - выходим, 
думаю их надо за комментировать.

извини я с телефона пишу.
 

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

 
Kudrev:

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


Проверить не могу - нет доступа.

Если открываете позицию, почему ждёте ResultOrder(), а не ResultDeal()?

 
Vladimir Karputov:

Проверить не могу - нет доступа.

Если открываете позицию, почему ждёте ResultOrder(), а не ResultDeal()?


друг я не программист. мне робота сделали за небольшие копейки. в этом я не понимаю

 

я думаю это из за обновления терминала тесте перестал к этому роботу грузиться

 
Kudrev:

я думаю это из за обновления терминала тесте перестал к этому роботу грузиться


Не факт. ОТ Вас всё так же нет информации:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Помогите пожалуйста с советником для МТ5

Vladimir Karputov, 2017.08.09 18:46

Какой тип счёта: неттинг или хедж? Какой символ, таймфрейм, исторический период и какой тип генерации тиков?

Какой билд терминала и название и битность операционной системы?

Причина обращения: