Error 4806:
ERR_INDICATOR_DATA_NOT_FOUND | 4806 | Requested data not found |
Check out the help: (Runtime Errors)
Documentation on MQL5: Constants, Enumerations and Structures / Codes of Errors and Warnings / Runtime Errors
- www.mql5.com
Runtime Errors - Codes of Errors and Warnings - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
//--- create handle of the indicator iDeMarker handle_iDeMarker=iDeMarker(m_symbol.Name(),InpWorkingPeriod,Inp_DeMarker_ma_period); //--- if the handle is not created if(handle_iDeMarker==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iDeMarker (\"iDeMarker\") indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(InpWorkingPeriod), GetLastError()); //--- the indicator is stopped early m_init_error=true; return(INIT_SUCCEEDED); } //--- create handle of the indicator iMA handle_iMA=iMA(m_symbol.Name(),InpWorkingPeriod,Inp_MA_ma_period,Inp_MA_ma_shift,Inp_MA_ma_method,Inp_MA_applied_price); //--- if the handle is not created if(handle_iMA==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iMA (\"iMA\") indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(InpWorkingPeriod), GetLastError()); //--- the indicator is stopped early m_init_error=true; return(INIT_SUCCEEDED); } //--- m_bar_current=(InpSignalsFrequency<10)?1:0; //--- return(INIT_SUCCEEDED); }
Let's play telepathy? Or maybe you deign to make an explanation?
Do I have to put separate declarations for buffers, I don't understand what the error is right after everything is compiled normally ...
/+------------------------------------------------------------------+ //| MA on DeMarker.mq5 | //| Copyright © 2020, Yordan Lechev | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2020, Yordan Lechev" #property link "https://www.mql5.com/" #property version "1.000" #property description "Trading strategy for the custom indicator 'MA on DeMarker'" #property tester_indicator "MA on DeMarker" #include <Trade\PositionInfo.mqh> #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\AccountInfo.mqh> #include <Trade\DealInfo.mqh> #include <Expert\Money\MoneyFixedMargin.mqh> //--- CPositionInfo m_position; // object of CPositionInfo class CTrade m_trade; // object of CTrade class CSymbolInfo m_symbol; // object of CSymbolInfo class CAccountInfo m_account; // object of CAccountInfo class CDealInfo m_deal; // object of CDealInfo class CMoneyFixedMargin *m_money; // object of CMoneyFixedMargin class //+------------------------------------------------------------------+ //| Enum Lor or Risk | //+------------------------------------------------------------------+ enum ENUM_LOT_OR_RISK { lots_min=0, // Lots Min lot=1, // Constant lot risk=2, // Risk in percent for a deal }; //+------------------------------------------------------------------+ //| Enum Trade Mode | //+------------------------------------------------------------------+ enum ENUM_TRADE_MODE { buy=0, // Allowed only BUY positions sell=1, // Allowed only SELL positions buy_sell=2, // Allowed BUY and SELL positions }; //+------------------------------------------------------------------+ //| Enum Pips Or Points | //+------------------------------------------------------------------+ enum ENUM_PIPS_OR_POINTS { pips=0, // Pips (1.00045-1.00055=1 pips) points=1, // Points (1.00045-1.00055=10 points) }; //--- input parameters input group "Trading settings" input ENUM_TIMEFRAMES InpWorkingPeriod=PERIOD_CURRENT; // Working timeframe input ENUM_PIPS_OR_POINTS InpPipsOrPoints=pips; // Pips Or Points: input uint InpStopLoss = 15; // Stop Loss input uint InpTakeProfit = 46; // Take Profit input ushort InpTrailingFrequency = 10; // Trailing, in seconds (< "10" -> only on a new bar) input ushort InpSignalsFrequency = 9; // Search signals, in seconds (< "10" -> only on a new bar) input uint InpTrailingStop = 25; // Trailing Stop (min distance from price to Stop Loss, in pips input uint InpTrailingStep = 5; // Trailing Step input group "Position size management (lot calculation)" input ENUM_LOT_OR_RISK InpLotOrRisk = risk; // Money management: Lot OR Risk input double InpVolumeLotOrRisk = 3.0; // The value for "Money management" input group "Trade mode" input ENUM_TRADE_MODE InpTradeMode = buy_sell; // Trade mode: input group "Time control" input bool InpTimeControl = true; // Use time control input uchar InpStartHour = 10; // Start Hour input uchar InpStartMinute = 01; // Start Minute input uchar InpEndHour = 15; // End Hour input uchar InpEndMinute = 02; // End Minute input group "DeMarker" input int Inp_DeMarker_ma_period = 14; // DeMarker: averaging period input group "MA" input int Inp_MA_ma_period = 6; // MA: averaging period input int Inp_MA_ma_shift = 5; // MA: horizontal shift input ENUM_MA_METHOD Inp_MA_ma_method = MODE_EMA; // MA: smoothing type input ENUM_APPLIED_PRICE Inp_MA_applied_price = PRICE_CLOSE; // MA: type of price input group "Levels" input double Inp_DeMarker_LevelUP = 0.8; // Level UP input double Inp_DeMarker_LevelDOWN = 0.2; // Level DOWN input group "Additional features" input bool InpOnlyOne = false; // Positions: Only one input bool InpReverse = false; // Positions: Reverse input bool InpCloseOpposite = false; // Positions: Close opposite input bool InpPrintLog = false; // Print log input uchar InpFreezeCoefficient = 1; // Coefficient (if Freeze==0 Or StopsLevels==0) input ulong InpDeviation = 10; // Deviation input ulong InpMagic = 200; // Magic number //--- double m_stop_loss = 0.0; // Stop Loss -> double double m_take_profit = 0.0; // Take Profit -> double double m_trailing_stop = 0.0; // Trailing Stop -> double double m_trailing_step = 0.0; // Trailing Step -> double int handle_iDeMarker; // variable for storing the handle of the iDeMarker indicator int handle_iMA; // variable for storing the handle of the iМА indicator double m_adjusted_point; // point value adjusted for 3 or 5 points datetime m_last_trailing = 0; // "0" -> D'1970.01.01 00:00'; datetime m_last_signal = 0; // "0" -> D'1970.01.01 00:00'; datetime m_prev_bars = 0; // "0" -> D'1970.01.01 00:00'; datetime m_last_deal_in = 0; // "0" -> D'1970.01.01 00:00'; int m_bar_current = 0; bool m_init_error = false; // error on InInit //--- the tactic is this: for positions we strictly monitor the result *** //+------------------------------------------------------------------+ //| Structure Positions | //+------------------------------------------------------------------+ struct STRUCT_POSITION { ENUM_POSITION_TYPE pos_type; // position type double volume; // position volume (if "0.0" -> the lot is "Money management") double lot_coefficient; // lot coefficient bool waiting_transaction; // waiting transaction, "true" -> it's forbidden to trade, we expect a transaction ulong waiting_order_ticket; // waiting order ticket, ticket of the expected order bool transaction_confirmed; // transaction confirmed, "true" -> transaction confirmed //--- Constructor STRUCT_POSITION() { pos_type = WRONG_VALUE; volume = 0.0; lot_coefficient = 0.0; waiting_transaction = false; waiting_order_ticket = 0; transaction_confirmed = false; } }; STRUCT_POSITION SPosition[]; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- forced initialization of variables m_init_error = false; // error on InInit //--- if(InpTrailingStop!=0 && InpTrailingStep==0) { string err_text=(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")? "Трейлинг невозможен: параметр \"Trailing Step\" равен нулю!": "Trailing is not possible: parameter \"Trailing Step\" is zero!"; //--- when testing, we will only output to the log about incorrect input parameters if(MQLInfoInteger(MQL_TESTER)) { Print(__FILE__," ",__FUNCTION__,", ERROR: ",err_text); return(INIT_FAILED); } else // if the Expert Advisor is run on the chart, tell the user about the error { Alert(__FILE__," ",__FUNCTION__,", ERROR: ",err_text); //--- m_init_error=true; return(INIT_PARAMETERS_INCORRECT); } } //--- ResetLastError(); if(!m_symbol.Name(Symbol())) // sets symbol name { Print(__FILE__," ",__FUNCTION__,", ERROR: CSymbolInfo.Name"); return(INIT_FAILED); } RefreshRates(); //--- m_trade.SetExpertMagicNumber(InpMagic); m_trade.SetMarginMode(); m_trade.SetTypeFillingBySymbol(m_symbol.Name()); m_trade.SetDeviationInPoints(InpDeviation); //--- tuning for 3 or 5 digits int digits_adjust=1; if(m_symbol.Digits()==3 || m_symbol.Digits()==5) digits_adjust=10; m_adjusted_point=m_symbol.Point()*digits_adjust; if(InpPipsOrPoints==pips) // Pips (1.00045-1.00055=1 pips) { m_stop_loss = InpStopLoss * m_adjusted_point; m_take_profit = InpTakeProfit * m_adjusted_point; m_trailing_stop = InpTrailingStop * m_adjusted_point; m_trailing_step = InpTrailingStep * m_adjusted_point; } else // Points (1.00045-1.00055=10 points) { m_stop_loss = InpStopLoss * m_symbol.Point(); m_take_profit = InpTakeProfit * m_symbol.Point(); m_trailing_stop = InpTrailingStop * m_symbol.Point(); m_trailing_step = InpTrailingStep * m_symbol.Point(); } //--- check the input parameter "Lots" string err_text=""; if(InpLotOrRisk==lot) { if(!CheckVolumeValue(InpVolumeLotOrRisk,err_text)) { //--- when testing, we will only output to the log about incorrect input parameters if(MQLInfoInteger(MQL_TESTER)) { Print(__FILE__," ",__FUNCTION__,", ERROR: ",err_text); return(INIT_FAILED); } else // if the Expert Advisor is run on the chart, tell the user about the error { Alert(__FILE__," ",__FUNCTION__,", ERROR: ",err_text); //--- m_init_error=true; return(INIT_PARAMETERS_INCORRECT); } } } else if(InpLotOrRisk==risk) { if(m_money!=NULL) delete m_money; m_money=new CMoneyFixedMargin; if(m_money!=NULL) { if(InpVolumeLotOrRisk<1 || InpVolumeLotOrRisk>100) { Print(__FILE__," ",__FUNCTION__,", ERROR: "); Print("The value for \"Money management\" (",DoubleToString(InpVolumeLotOrRisk,2),") -> invalid parameters"); Print(" parameter must be in the range: from 1.00 to 100.00"); //--- m_init_error=true; return(INIT_FAILED); } if(!m_money.Init(GetPointer(m_symbol),InpWorkingPeriod,m_symbol.Point()*digits_adjust)) { Print(__FILE__," ",__FUNCTION__,", ERROR: CMoneyFixedMargin.Init"); //--- m_init_error=true; return(INIT_FAILED); } m_money.Percent(InpVolumeLotOrRisk); } else { Print(__FILE__," ",__FUNCTION__,", ERROR: Object CMoneyFixedMargin is NULL"); return(INIT_FAILED); } } //--- create handle of the indicator iDeMarker handle_iDeMarker=iDeMarker(m_symbol.Name(),InpWorkingPeriod,Inp_DeMarker_ma_period); //--- if the handle is not created if(handle_iDeMarker==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iDeMarker (\"iDeMarker\") indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(InpWorkingPeriod), GetLastError()); //--- the indicator is stopped early m_init_error=true; return(INIT_SUCCEEDED); } //--- create handle of the indicator iMA handle_iMA=iMA(m_symbol.Name(),InpWorkingPeriod,Inp_MA_ma_period,Inp_MA_ma_shift,Inp_MA_ma_method,Inp_MA_applied_price); //--- if the handle is not created if(handle_iMA==INVALID_HANDLE) { //--- tell about the failure and output the error code PrintFormat("Failed to create handle of the iMA (\"iMA\") indicator for the symbol %s/%s, error code %d", m_symbol.Name(), EnumToString(InpWorkingPeriod), GetLastError()); //--- the indicator is stopped early m_init_error=true; return(INIT_SUCCEEDED); } //--- m_bar_current=(InpSignalsFrequency<10)?1:0; //--- return(INIT_SUCCEEDED); }
Discover new MetaTrader 5 opportunities with MQL5 community and services
- www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
//+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- if(m_money!=NULL) delete m_money; } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if(m_init_error) return; //--- int size_need_position=ArraySize(SPosition); if(size_need_position>0) { for(int i=size_need_position-1; i>=0; i--) { if(SPosition[i].waiting_transaction) { if(!SPosition[i].transaction_confirmed) { if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", OK: ","transaction_confirmed: ",SPosition[i].transaction_confirmed); return; } else if(SPosition[i].transaction_confirmed) { ArrayRemove(SPosition,i,1); return; } } if(SPosition[i].pos_type==POSITION_TYPE_BUY) { if(InpCloseOpposite || InpOnlyOne) { int count_buys = 0; double volume_buys = 0.0; double volume_biggest_buys = 0.0; int count_sells = 0; double volume_sells = 0.0; double volume_biggest_sells = 0.0; CalculateAllPositions(count_buys,volume_buys,volume_biggest_buys, count_sells,volume_sells,volume_biggest_sells); if(InpCloseOpposite) { if(count_sells>0) { ClosePositions(POSITION_TYPE_SELL); return; } } if(InpOnlyOne) { if(count_buys+count_sells==0) { SPosition[i].waiting_transaction=true; OpenPosition(i); return; } else ArrayRemove(SPosition,i,1); return; } } SPosition[i].waiting_transaction=true; OpenPosition(i); return; } if(SPosition[i].pos_type==POSITION_TYPE_SELL) { if(InpCloseOpposite || InpOnlyOne) { int count_buys = 0; double volume_buys = 0.0; double volume_biggest_buys = 0.0; int count_sells = 0; double volume_sells = 0.0; double volume_biggest_sells = 0.0; CalculateAllPositions(count_buys,volume_buys,volume_biggest_buys, count_sells,volume_sells,volume_biggest_sells); if(InpCloseOpposite) { if(count_buys>0) { ClosePositions(POSITION_TYPE_BUY); return; } } if(InpOnlyOne) { if(count_buys+count_sells==0) { SPosition[i].waiting_transaction=true; OpenPosition(i); return; } else ArrayRemove(SPosition,i,1); return; } } SPosition[i].waiting_transaction=true; OpenPosition(i); return; } } } //--- if(InpTrailingFrequency>=10) // trailing no more than once every 10 seconds { datetime time_current=TimeCurrent(); if(time_current-m_last_trailing>InpTrailingFrequency) { Trailing(); m_last_trailing=time_current; } } if(InpSignalsFrequency>=10) // search for trading signals no more than once every 10 seconds { datetime time_current=TimeCurrent(); if(time_current-m_last_signal>InpSignalsFrequency) { //--- search for trading signals if(!RefreshRates()) { m_prev_bars=0; return; } if(!SearchTradingSignals()) { m_prev_bars=0; return; } m_last_signal=time_current; } } //--- we work only at the time of the birth of new bar datetime time_0=iTime(m_symbol.Name(),InpWorkingPeriod,0); if(time_0==m_prev_bars) return; m_prev_bars=time_0; if(InpTrailingFrequency<10) // trailing only at the time of the birth of new bar { Trailing(); } if(InpSignalsFrequency<10) // search for trading signals only at the time of the birth of new bar { if(!RefreshRates()) { m_prev_bars=0; return; } //--- search for trading signals if(!SearchTradingSignals()) { m_prev_bars=0; return; } } //--- }
//+------------------------------------------------------------------+ //| TradeTransaction function | //+------------------------------------------------------------------+ void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) { //--- get transaction type as enumeration value ENUM_TRADE_TRANSACTION_TYPE type=trans.type; //--- if transaction is result of addition of the transaction in history if(type==TRADE_TRANSACTION_DEAL_ADD) { if(HistoryDealSelect(trans.deal)) m_deal.Ticket(trans.deal); else return; if(m_deal.Symbol()==m_symbol.Name() && m_deal.Magic()==InpMagic) { if(m_deal.DealType()==DEAL_TYPE_BUY || m_deal.DealType()==DEAL_TYPE_SELL) { if(m_deal.Entry()==DEAL_ENTRY_IN || m_deal.Entry()==DEAL_ENTRY_INOUT) m_last_deal_in=iTime(m_symbol.Name(),InpWorkingPeriod,0); int size_need_position=ArraySize(SPosition); if(size_need_position>0) { for(int i=0; i<size_need_position; i++) { if(SPosition[i].waiting_transaction) if(SPosition[i].waiting_order_ticket==m_deal.Order()) { Print(__FUNCTION__," Transaction confirmed"); SPosition[i].transaction_confirmed=true; break; } } } } } } } //+------------------------------------------------------------------+ //| Refreshes the symbol quotes data | //+------------------------------------------------------------------+ bool RefreshRates() { //--- refresh rates if(!m_symbol.RefreshRates()) { if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", ERROR: ","RefreshRates error"); return(false); } //--- protection against the return value of "zero" if(m_symbol.Ask()==0 || m_symbol.Bid()==0) { if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", ERROR: ","Ask == 0.0 OR Bid == 0.0"); return(false); } //--- return(true); } //+------------------------------------------------------------------+ //| Check the correctness of the position volume | //+------------------------------------------------------------------+ bool CheckVolumeValue(double volume,string &error_description) { //--- minimal allowed volume for trade operations double min_volume=m_symbol.LotsMin(); if(volume<min_volume) { if(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian") error_description=StringFormat("Объем меньше минимально допустимого SYMBOL_VOLUME_MIN=%.2f",min_volume); else error_description=StringFormat("Volume is less than the minimal allowed SYMBOL_VOLUME_MIN=%.2f",min_volume); return(false); } //--- maximal allowed volume of trade operations double max_volume=m_symbol.LotsMax(); if(volume>max_volume) { if(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian") error_description=StringFormat("Объем больше максимально допустимого SYMBOL_VOLUME_MAX=%.2f",max_volume); else error_description=StringFormat("Volume is greater than the maximal allowed SYMBOL_VOLUME_MAX=%.2f",max_volume); return(false); } //--- get minimal step of volume changing double volume_step=m_symbol.LotsStep(); int ratio=(int)MathRound(volume/volume_step); if(MathAbs(ratio*volume_step-volume)>0.0000001) { if(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian") error_description=StringFormat("Объем не кратен минимальному шагу SYMBOL_VOLUME_STEP=%.2f, ближайший правильный объем %.2f", volume_step,ratio*volume_step); else error_description=StringFormat("Volume is not a multiple of the minimal step SYMBOL_VOLUME_STEP=%.2f, the closest correct volume is %.2f", volume_step,ratio*volume_step); return(false); } error_description="Correct volume value"; return(true); }
//+------------------------------------------------------------------+ //| Lot Check | //+------------------------------------------------------------------+ double LotCheck(double lots,CSymbolInfo &symbol) { //--- calculate maximum volume double volume=NormalizeDouble(lots,2); double stepvol=symbol.LotsStep(); if(stepvol>0.0) volume=stepvol*MathFloor(volume/stepvol); //--- double minvol=symbol.LotsMin(); if(volume<minvol) volume=0.0; //--- double maxvol=symbol.LotsMax(); if(volume>maxvol) volume=maxvol; return(volume); } //+------------------------------------------------------------------+ //| Check Freeze and Stops levels | //+------------------------------------------------------------------+ void FreezeStopsLevels(double &freeze,double &stops) { //--- check Freeze and Stops levels /* SYMBOL_TRADE_FREEZE_LEVEL shows the distance of freezing the trade operations for pending orders and open positions in points ------------------------|--------------------|-------------------------------------------- Type of order/position | Activation price | Check ------------------------|--------------------|-------------------------------------------- Buy Limit order | Ask | Ask-OpenPrice >= SYMBOL_TRADE_FREEZE_LEVEL Buy Stop order | Ask | OpenPrice-Ask >= SYMBOL_TRADE_FREEZE_LEVEL Sell Limit order | Bid | OpenPrice-Bid >= SYMBOL_TRADE_FREEZE_LEVEL Sell Stop order | Bid | Bid-OpenPrice >= SYMBOL_TRADE_FREEZE_LEVEL Buy position | Bid | TakeProfit-Bid >= SYMBOL_TRADE_FREEZE_LEVEL | | Bid-StopLoss >= SYMBOL_TRADE_FREEZE_LEVEL Sell position | Ask | Ask-TakeProfit >= SYMBOL_TRADE_FREEZE_LEVEL | | StopLoss-Ask >= SYMBOL_TRADE_FREEZE_LEVEL ------------------------------------------------------------------------------------------ SYMBOL_TRADE_STOPS_LEVEL determines the number of points for minimum indentation of the StopLoss and TakeProfit levels from the current closing price of the open position ------------------------------------------------|------------------------------------------ Buying is done at the Ask price | Selling is done at the Bid price ------------------------------------------------|------------------------------------------ TakeProfit >= Bid | TakeProfit <= Ask StopLoss <= Bid | StopLoss >= Ask TakeProfit - Bid >= SYMBOL_TRADE_STOPS_LEVEL | Ask - TakeProfit >= SYMBOL_TRADE_STOPS_LEVEL Bid - StopLoss >= SYMBOL_TRADE_STOPS_LEVEL | StopLoss - Ask >= SYMBOL_TRADE_STOPS_LEVEL ------------------------------------------------------------------------------------------ */ double coeff=(double)InpFreezeCoefficient; if(!RefreshRates() || !m_symbol.Refresh()) return; //--- FreezeLevel -> for pending order and modification double freeze_level=m_symbol.FreezeLevel()*m_symbol.Point(); if(freeze_level==0.0) if(InpFreezeCoefficient>0) freeze_level=(m_symbol.Ask()-m_symbol.Bid())*coeff; //--- StopsLevel -> for TakeProfit and StopLoss double stop_level=m_symbol.StopsLevel()*m_symbol.Point(); if(stop_level==0.0) if(InpFreezeCoefficient>0) stop_level=(m_symbol.Ask()-m_symbol.Bid())*coeff; //--- freeze=freeze_level; stops=stop_level; //--- return; } //+------------------------------------------------------------------+ //| Open position | //| double stop_loss | //| -> pips * m_adjusted_point (if "0.0" -> the m_stop_loss) | //| double take_profit | //| -> pips * m_adjusted_point (if "0.0" -> the m_take_profit) | //+------------------------------------------------------------------+ void OpenPosition(const int index) { double freeze=0.0,stops=0.0; FreezeStopsLevels(freeze,stops); /* SYMBOL_TRADE_STOPS_LEVEL determines the number of points for minimum indentation of the StopLoss and TakeProfit levels from the current closing price of the open position ------------------------------------------------|------------------------------------------ Buying is done at the Ask price | Selling is done at the Bid price ------------------------------------------------|------------------------------------------ TakeProfit >= Bid | TakeProfit <= Ask StopLoss <= Bid | StopLoss >= Ask TakeProfit - Bid >= SYMBOL_TRADE_STOPS_LEVEL | Ask - TakeProfit >= SYMBOL_TRADE_STOPS_LEVEL Bid - StopLoss >= SYMBOL_TRADE_STOPS_LEVEL | StopLoss - Ask >= SYMBOL_TRADE_STOPS_LEVEL ------------------------------------------------------------------------------------------ */ //--- buy if(SPosition[index].pos_type==POSITION_TYPE_BUY) { double sl=(m_stop_loss==0.0)?0.0:m_symbol.Ask()-m_stop_loss; if(sl>0.0) if(m_symbol.Bid()-sl<stops) sl=m_symbol.Bid()-stops; double tp=(m_take_profit==0.0)?0.0:m_symbol.Ask()+m_take_profit; if(tp>0.0) if(tp-m_symbol.Ask()<stops) tp=m_symbol.Ask()+stops; OpenBuy(index,sl,tp); return; } //--- sell if(SPosition[index].pos_type==POSITION_TYPE_SELL) { double sl=(m_stop_loss==0.0)?0.0:m_symbol.Bid()+m_stop_loss; if(sl>0.0) if(sl-m_symbol.Ask()<stops) sl=m_symbol.Ask()+stops; double tp=(m_take_profit==0.0)?0.0:m_symbol.Bid()-m_take_profit; if(tp>0.0) if(m_symbol.Bid()-tp<stops) tp=m_symbol.Bid()-stops; OpenSell(index,sl,tp); return; } }
//+------------------------------------------------------------------+ //| Open Buy position | //+------------------------------------------------------------------+ void OpenBuy(const int index,double sl,double tp) { sl=m_symbol.NormalizePrice(sl); tp=m_symbol.NormalizePrice(tp); double long_lot=0.0; if(SPosition[index].volume>0.0) long_lot=SPosition[index].volume; else { if(InpLotOrRisk==risk) { long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl); if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", OK: ","sl=",DoubleToString(sl,m_symbol.Digits()), ", CheckOpenLong: ",DoubleToString(long_lot,2), ", Balance: ", DoubleToString(m_account.Balance(),2), ", Equity: ", DoubleToString(m_account.Equity(),2), ", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2)); if(long_lot==0.0) { ArrayRemove(SPosition,index,1); if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", ERROR: ","CMoneyFixedMargin.CheckOpenLong returned the value of 0.0"); return; } } else if(InpLotOrRisk==lot) long_lot=InpVolumeLotOrRisk; else if(InpLotOrRisk==lots_min) long_lot=m_symbol.LotsMin(); else { ArrayRemove(SPosition,index,1); return; } } if(SPosition[index].lot_coefficient>0.0) { long_lot=LotCheck(long_lot*SPosition[index].lot_coefficient, m_symbol); if(long_lot==0) { ArrayRemove(SPosition,index,1); if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", ERROR: ","LotCheck returned the 0.0"); return; } } if(m_symbol.LotsLimit()>0.0) { int count_buys = 0; double volume_buys = 0.0; double volume_biggest_buys = 0.0; int count_sells = 0; double volume_sells = 0.0; double volume_biggest_sells = 0.0; CalculateAllPositions(count_buys,volume_buys,volume_biggest_buys, count_sells,volume_sells,volume_biggest_sells); if(volume_buys+volume_sells+long_lot>m_symbol.LotsLimit()) { ArrayRemove(SPosition,index,1); if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", ERROR: ","#0 Buy, Volume Buy (",DoubleToString(volume_buys,2), ") + Volume Sell (",DoubleToString(volume_sells,2), ") + Volume long (",DoubleToString(long_lot,2), ") > Lots Limit (",DoubleToString(m_symbol.LotsLimit(),2),")"); return; } } //--- check volume before OrderSend to avoid "not enough money" error (CTrade) double free_margin_check=m_account.FreeMarginCheck(m_symbol.Name(), ORDER_TYPE_BUY, long_lot, m_symbol.Ask()); double margin_check=m_account.MarginCheck(m_symbol.Name(), ORDER_TYPE_BUY, long_lot, m_symbol.Ask()); if(free_margin_check>margin_check) { if(m_trade.Buy(long_lot,m_symbol.Name(), m_symbol.Ask(),sl,tp)) // CTrade::Buy -> "true" { if(m_trade.ResultDeal()==0) { if(m_trade.ResultRetcode()==10009) // trade order went to the exchange { SPosition[index].waiting_transaction=true; SPosition[index].waiting_order_ticket=m_trade.ResultOrder(); } else { SPosition[index].waiting_transaction=false; if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", ERROR: ","#1 Buy -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); } if(InpPrintLog) PrintResultTrade(m_trade,m_symbol); } else { if(m_trade.ResultRetcode()==10009) { SPosition[index].waiting_transaction=true; SPosition[index].waiting_order_ticket=m_trade.ResultOrder(); } else { SPosition[index].waiting_transaction=false; if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", OK: ","#2 Buy -> true. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); } if(InpPrintLog) PrintResultTrade(m_trade,m_symbol); } } else { SPosition[index].waiting_transaction=false; if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", ERROR: ","#3 Buy -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); if(InpPrintLog) PrintResultTrade(m_trade,m_symbol); } } else { ArrayRemove(SPosition,index,1); if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", ERROR: ","CAccountInfo.FreeMarginCheck returned the value ",DoubleToString(free_margin_check,2)); return; } //--- } //+------------------------------------------------------------------+ //| Open Sell position | //+------------------------------------------------------------------+ void OpenSell(const int index,double sl,double tp) { sl=m_symbol.NormalizePrice(sl); tp=m_symbol.NormalizePrice(tp); double short_lot=0.0; if(SPosition[index].volume>0.0) short_lot=SPosition[index].volume; else { if(InpLotOrRisk==risk) { short_lot=m_money.CheckOpenShort(m_symbol.Bid(),sl); if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", OK: ","sl=",DoubleToString(sl,m_symbol.Digits()), ", CheckOpenLong: ",DoubleToString(short_lot,2), ", Balance: ", DoubleToString(m_account.Balance(),2), ", Equity: ", DoubleToString(m_account.Equity(),2), ", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2)); if(short_lot==0.0) { ArrayRemove(SPosition,index,1); if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", ERROR: ","CMoneyFixedMargin.CheckOpenShort returned the value of \"0.0\""); return; } } else if(InpLotOrRisk==lot) short_lot=InpVolumeLotOrRisk; else if(InpLotOrRisk==lots_min) short_lot=m_symbol.LotsMin(); else { ArrayRemove(SPosition,index,1); return; } } if(SPosition[index].lot_coefficient>0.0) { short_lot=LotCheck(short_lot*SPosition[index].lot_coefficient,m_symbol); if(short_lot==0) { ArrayRemove(SPosition,index,1); if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", ERROR: ","LotCheck returned the 0.0"); return; } } if(m_symbol.LotsLimit()>0.0) { int count_buys = 0; double volume_buys = 0.0; double volume_biggest_buys = 0.0; int count_sells = 0; double volume_sells = 0.0; double volume_biggest_sells = 0.0; CalculateAllPositions(count_buys,volume_buys,volume_biggest_buys, count_sells,volume_sells,volume_biggest_sells); if(volume_buys+volume_sells+short_lot>m_symbol.LotsLimit()) { ArrayRemove(SPosition,index,1); if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", ERROR: ","#0 Buy, Volume Buy (",DoubleToString(volume_buys,2), ") + Volume Sell (",DoubleToString(volume_sells,2), ") + Volume short (",DoubleToString(short_lot,2), ") > Lots Limit (",DoubleToString(m_symbol.LotsLimit(),2),")"); return; } } //--- check volume before OrderSend to avoid "not enough money" error (CTrade) double free_margin_check=m_account.FreeMarginCheck(m_symbol.Name(), ORDER_TYPE_SELL, short_lot, m_symbol.Bid()); double margin_check=m_account.MarginCheck(m_symbol.Name(), ORDER_TYPE_SELL, short_lot, m_symbol.Bid()); if(free_margin_check>margin_check) { if(m_trade.Sell(short_lot,m_symbol.Name(), m_symbol.Bid(),sl,tp)) // CTrade::Sell -> "true" { if(m_trade.ResultDeal()==0) { if(m_trade.ResultRetcode()==10009) // trade order went to the exchange { SPosition[index].waiting_transaction=true; SPosition[index].waiting_order_ticket=m_trade.ResultOrder(); } else { SPosition[index].waiting_transaction=false; if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", ERROR: ","#1 Sell -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); } if(InpPrintLog) PrintResultTrade(m_trade,m_symbol); } else { if(m_trade.ResultRetcode()==10009) { SPosition[index].waiting_transaction=true; SPosition[index].waiting_order_ticket=m_trade.ResultOrder(); } else { SPosition[index].waiting_transaction=false; if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", OK: ","#2 Sell -> true. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); } if(InpPrintLog) PrintResultTrade(m_trade,m_symbol); } } else { SPosition[index].waiting_transaction=false; if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", ERROR: ","#3 Sell -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); if(InpPrintLog) PrintResultTrade(m_trade,m_symbol); } } else { ArrayRemove(SPosition,index,1); if(InpPrintLog) Print(__FILE__," ",__FUNCTION__,", ERROR: ","CAccountInfo.FreeMarginCheck returned the value ",DoubleToString(free_margin_check,2)); return; } //--- }
You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
Error: