Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Michail_David : 사람들! 말하다. 테스터는 오류를 제공합니다: 2017.02.08 18:24:43.751TestGenerator: 일치하지 않는 데이터 오류(2016.07.27 19:30의 낮은 값 1.09860은 최소 시간 프레임에서 도달하지 않음, 낮은 가격 1.09880 불일치)
직접 코드를 작성하는 방법을 배우고 싶습니다.. 그래서 조언을 구하기로 했습니다. 누군가가 샘플을 줄 것이라고 생각했습니다.. 감사합니다!
고객은 EA가 차트에서 제거되었음에도 불구하고 EA가 계속 거래를 개시한다고 불평합니다. 똑같을순 없나요?
제거되고 올바르게 작성된 경우 - 없어야 합니다. 초기화 해제 코드로 언로딩 - 1. EA가 막히면... 해결해야 합니다...
Expert Advisor로 창을 닫으면 Expert Advisor가 초기화 해제 코드 - 4로 언로드되어야 합니다.
REASON_CHARTCLOSE
4
차트 닫힘
https://www.mql5.com/ru/docs/constants/namedconstants/uninit
글쎄, 내가 새는 따옴표와 좋은 품질의 tixtory를 기억하는 한 메타 따옴표가 있습니다.
어떤 종류의 라인을 원하는지 이해하기 위한 스크린샷
병합하려는 라인을 이해하기 위한 스크린샷.
병합하려는 라인을 이해하기 위한 스크린샷. 당신의 답변에 감사드립니다! MT4에서 두 개의 상단 악기 라인을 하나로 결합하고 싶습니다.
변수 dT의 빨간색은 무엇을 의미합니까?
변수 dT의 빨간색은 무엇을 의미합니까?
double Lots=Margin_Percent/ MarketInfo ( Symbol (), MODE_MARGINREQUIRED ); //Определение общего количества лотов
double Lots_Volume=( MathFloor (Lots)+ MarketInfo ( Symbol (), MODE_LOTSTEP ));
double MacdCurrent= iMACD ( NULL , 0 ,Fast_EMA_Period,Slow_EMA_Period,Signal_Period, PRICE_CLOSE , MODE_MAIN , 1 ); //Параметры MACD основной линии текущего бара
double MacdPrevious1= iMACD ( NULL , 0 ,Fast_EMA_Period,Slow_EMA_Period,Signal_Period, PRICE_CLOSE , MODE_MAIN , 2 ); //Параметры MACD основной линии предыдущего бара
double MacdPrevious2= iMACD ( NULL , 0 ,Fast_EMA_Period,Slow_EMA_Period,Signal_Period, PRICE_CLOSE , MODE_MAIN , 3 ); //Параметры MACD основной линии со смещением на 2 бара
double StopLoss= iSAR ( NULL , 0 ,Step_PSAR,Maximum_PSAR, 0 ); //Параметры Трейлинг стоп по параметрам ParabolicSAR текущего бара
double Previous_StopLoss= iSAR ( NULL , 0 ,Step_PSAR,Maximum_PSAR, 1 ); //Параметры СтопЛосс по параметрам ParabolicSAR предыдущего бара
double CurrentPSAR= iSAR ( NULL , 0 ,Step_PSAR,Maximum_PSAR, 1 ); //Параметры СтопЛосс по параметрам ParabolicSAR предыдущего бара
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick ()
{
static datetime New_Time= TimeCurrent (); // Время текущего бара
bool New_Bar= false ; // Флаг нового бара
int ticket,total,cnt;
//---------------------------------------------------------------------------
total= OrdersTotal (); // Опредление количства ордеров
if (total< 1 )
{
//--- нет открытых ордеров
if (Margin_Percent< MarketInfo ( Symbol (), MODE_MARGINREQUIRED )*( MarketInfo ( Symbol (), MODE_MINLOT )))
//Проверка на наличие денежных средств для открытия минимального лота
{
Print ( "Не хватает средств. Свободные средства = " , AccountFreeMargin ());
return ;
}
if ( Time [ 0 ]==New_Time) // Сравниваем время
{
New_Bar= true ; // Поймался новый бар
if (New_Bar== false ) // Если бар не новый..
return ; // ..то уходим
}
//Определение количества лотов
if (Lots>Lots_Volume)
Lots=Lots_Volume;
else if (Lots<Lots_Volume)
Lots= MathFloor (Lots);
return ;
//--- условие для открытия длинной позиции (BUY)
if (CurrentPSAR< iOpen ( NULL , 0 , 1 ) &&
((MacdPrevious1> 0 && MacdPrevious2< 0 ) ||
(MacdCurrent> 0 && MacdPrevious1< 0 ) ||
(MacdCurrent> 0 && MacdPrevious1== 0 && MacdPrevious2< 0 )||
(MacdCurrent> 0 && MacdPrevious1== 0 && MacdPrevious2== 0 )))
{
ticket= OrderSend ( Symbol (), OP_BUY ,Lots, Ask , 3 ,StopLoss+ MarketInfo ( Symbol (), MODE_STOPLEVEL )* Point , 0 , NULL ,MAGICNUMBER, 0 ,Green);
if (ticket> 0 ) //проверка отрытия позиции
{
if ( OrderSelect (ticket, SELECT_BY_TICKET , MODE_TRADES ))
Print ( "BUY ордер открыт : " , OrderOpenPrice ());
else Print ( "Ошибка открытия ордера BUY : " , GetLastError ());
return ;
}
}
//--- условие для открытия короткой позиции (SELL)
if (CurrentPSAR> iOpen ( NULL , 0 , 1 ) &&
((MacdCurrent< 0 && MacdPrevious1> 0 ) ||
(MacdPrevious1< 0 && MacdPrevious2> 0 ) ||
(MacdCurrent< 0 && MacdPrevious1< 0 && MacdPrevious2> 0 ) ||
(MacdCurrent< 0 && MacdPrevious1== 0 && MacdPrevious2== 0 )))
{
ticket= OrderSend ( Symbol (), OP_SELL ,Lots, Bid , 3 ,StopLoss- MarketInfo ( Symbol (), MODE_STOPLEVEL )* Point , 0 , NULL ,MAGICNUMBER, 0 ,Red);
if (ticket> 0 ) //проверка открытия позиции
{
if ( OrderSelect (ticket, SELECT_BY_TICKET , MODE_TRADES ))
Print ( "SELL ордер открыт : " , OrderOpenPrice ());
else Print ( "Ошибка открытия ордера SELL : " , GetLastError ());
return ;
}
}
return ; //--- выход из блока "нет открытых ордеров"
}
//--- важно правильно войти в рынок, но более важно правильно из него выйти
for (cnt= 0 ;cnt<total;cnt++)
{
if (! OrderSelect (cnt, SELECT_BY_POS , MODE_TRADES ))
continue ;
if ( OrderMagicNumber ()==MAGICNUMBER && // проверка магического номера ордера
OrderSymbol ()== Symbol ()) // проверка символа ордера
{
//--- длинная позиция открыта
if ( OrderType ()== OP_BUY )
{
//--- должен быть закрыт?
if (CurrentPSAR> iOpen ( NULL , 0 , 1 ) &&
((MacdCurrent< 0 && MacdPrevious1> 0 ) ||
(MacdPrevious1< 0 && MacdPrevious2> 0 ) ||
(MacdCurrent< 0 && MacdPrevious1< 0 && MacdPrevious2> 0 ) ||
(MacdCurrent< 0 && MacdPrevious1== 0 && MacdPrevious2== 0 )))
{
//--- закрытие ордера и выход
if ( OrderClose ( OrderTicket (), OrderLots (), Bid , 3 ,Violet))
{
Print ( "Ордер закрыт" );
ticket= OrderSend ( Symbol (), OP_SELL ,Lots, Bid , 3 ,StopLoss- MarketInfo ( Symbol (), MODE_STOPLEVEL )* Point , 0 , NULL ,MAGICNUMBER, 0 ,Red);
if (ticket> 0 ) //проверка открытия позиции
{
if ( OrderSelect (ticket, SELECT_BY_TICKET , MODE_TRADES ))
Print ( "SELL ордер открыт : " , OrderOpenPrice ());
else Print ( "Ошибка открытия ордера SELL : " , GetLastError ());
return ;
}
}
else Print ( "Ошибка закрытия ордера " , GetLastError ());
}
//------------------Модификация ордера по СтопЛоссу
else if (StopLoss>Previous_StopLoss && StopLoss< iOpen ( NULL , 0 , 0 ))
{
if ( OrderModify ( OrderTicket (), OrderOpenPrice (),StopLoss+ MarketInfo ( Symbol (), MODE_STOPLEVEL )* Point , 0 , 0 ,Blue))
Print ( "Цена Stop Loss ордера успешно модифицирована." );
else Print ( "Ошибка модификации ордера. Код ошибки=" , GetLastError ());
return ;
}
return ;
}
// идём на короткую позицию
else if ( OrderType ()== OP_SELL )
{
//--- должен быть закрыт?
if (CurrentPSAR< iOpen ( NULL , 0 , 1 ) &&
((MacdPrevious1> 0 && MacdPrevious2< 0 ) ||
(MacdCurrent> 0 && MacdPrevious1< 0 ) ||
(MacdCurrent> 0 && MacdPrevious1== 0 && MacdPrevious2< 0 )||
(MacdCurrent> 0 && MacdPrevious1== 0 && MacdPrevious2== 0 )))
{
//--- закрытие ордера и выход
if ( OrderClose ( OrderTicket (), OrderLots (), Ask , 3 ,Violet))
{
Print ( "Ордер закрыт" );
ticket= OrderSend ( Symbol (), OP_BUY ,Lots, Ask , 3 ,StopLoss+ MarketInfo ( Symbol (), MODE_STOPLEVEL )* Point , 0 , NULL ,MAGICNUMBER, 0 ,Green);
if (ticket> 0 ) //проверка отрытия позиции
{
if ( OrderSelect (ticket, SELECT_BY_TICKET , MODE_TRADES ))
Print ( "BUY ордер открыт : " , OrderOpenPrice ());
else Print ( "Ошибка открытия ордера BUY : " , GetLastError ());
return ;
}
}
else Print ( "Ошибка закрытия ордера " , GetLastError ());
}
//-----------------Модификация ордера по СтопЛоссу
else if (StopLoss<Previous_StopLoss && StopLoss> iOpen ( NULL , 0 , 0 ))
{
if ( OrderModify ( OrderTicket (), OrderOpenPrice (),StopLoss- MarketInfo ( Symbol (), MODE_STOPLEVEL )* Point , 0 , 0 ,Blue))
Print ( "Цена Stop Loss ордера успешно модифицирована." );
else Print ( "Ошибка модификации ордера. Код ошибки=" , GetLastError ());
return ;
}
}
}
}
//------
}
//-------------------------------------------------------------------------------------------------------
사람들! 말하다. 테스터는 오류를 제공합니다: 2017.02.08 18:24:43.751 TestGenerator: 일치하지 않는 데이터 오류(2016.07.27 19:30의 낮은 값 1.09860은 최소 시간 프레임에서 도달하지 않음, 낮은 가격 1.09880 불일치)