к автору пробовали обратиться?
...
Пожалуйста, нужно вставлять код правильно. Невозможно читать эту простыню обычного текста.
извините. вот как положено
//+------------------------------------------------------------------+ //| 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); } } } //+------------------------------------------------------------------+
Какой тип счёта: неттинг или хедж? Какой символ, таймфрейм, исторический период и какой тип генерации тиков?
Какой билд терминала и название и битность операционной системы?извините. вот как положено
счет обычный. торгую фьючерсами на срочном рынке на 15 мин. фьючерсом на нефть брент, период тестирования июль и август, тип генерации все тики. торгую через открытие, пробовал на многих операционный системах. до июля тестировлся нормаотно а в конце июля перестал
счет обычный. торгую фьючерсами на срочном рынке на 15 мин. фьючерсом на нефть брент, период тестирования июль и август, тип генерации все тики. торгую через открытие, пробовал на многих операционный системах. до июля тестировлся нормаотно а в конце июля перестал
Проверить не могу - нет доступа.
Если открываете позицию, почему ждёте ResultOrder(), а не ResultDeal()?
Проверить не могу - нет доступа.
Если открываете позицию, почему ждёте ResultOrder(), а не ResultDeal()?
друг я не программист. мне робота сделали за небольшие копейки. в этом я не понимаю
я думаю это из за обновления терминала тесте перестал к этому роботу грузиться
Не факт. ОТ Вас всё так же нет информации:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Помогите пожалуйста с советником для МТ5
Vladimir Karputov, 2017.08.09 18:46
Какой тип счёта: неттинг или хедж? Какой символ, таймфрейм, исторический период и какой тип генерации тиков?
Какой билд терминала и название и битность операционной системы?- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Суть в том что робот на реале торгует без проблем. А когда прогоняешь в тестере стратегий то в тестере робот открывает 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);
}
}
}
//+------------------------------------------------------------------+
Ребята помогите пожалуйста.