Добрый день! Уже который день бьюсь с данной проблемой.
Вот мой код:
Постоянно вылазит ошибка: failed market buy _____ EURUSD sl: ____ tp: ____ [Invalid volume]
Мне нужно, чтобы volume определялось как баланс деленное на Lots.
request.volume=AccountInfoDouble(ACCOUNT_BALANCE)/Lots;
У Вас баланс 1000 долларов , лот равен 1
в результате Ваш код будет пытаться войти в рынок 1000 лотами...
Добрый день! Уже который день бьюсь с данной проблемой.
Вот мой код:
Постоянно вылазит ошибка: failed market buy _____ EURUSD sl: ____ tp: ____ [Invalid volume]
Мне нужно, чтобы volume определялось как баланс деленное на Lots.
Запустите этот пример - в нём стопы и лот нормализованы:
//+------------------------------------------------------------------+ //| 123.mq5 | //| Copyright © 2018, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2018, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.000" //--- #include <Trade\PositionInfo.mqh> #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\AccountInfo.mqh> CPositionInfo m_position; // trade position object CTrade m_trade; // trading object CSymbolInfo m_symbol; // symbol info object CAccountInfo m_account; // account info wrapper //--- input parameters input double InpLots = 0.1; // Lots input ushort InpStopLoss = 50; // Stop Loss (in pips) input ushort InpTakeProfit = 50; // Take Profit (in pips) double ExtStopLoss=0.0; double ExtTakeProfit=0.0; double m_adjusted_point; // point value adjusted for 3 or 5 points //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- if(!m_symbol.Name(Symbol())) // sets symbol name return(INIT_FAILED); RefreshRates(); //--- if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK)) m_trade.SetTypeFilling(ORDER_FILLING_FOK); else if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC)) m_trade.SetTypeFilling(ORDER_FILLING_IOC); else m_trade.SetTypeFilling(ORDER_FILLING_RETURN); //--- 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; ExtStopLoss=InpStopLoss*m_adjusted_point; ExtTakeProfit=InpTakeProfit*m_adjusted_point; //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(!RefreshRates()) return; //--- open buy double sl=(InpStopLoss==0)?0.0:m_symbol.Ask()-ExtStopLoss; double tp=(InpTakeProfit==0)?0.0:m_symbol.Ask()+ExtTakeProfit; double lot=m_account.Balance()/InpLots; lot=LotCheck(lot); if(lot!=0) { m_trade.Buy(lot,m_symbol.Name(),m_symbol.Ask(), m_symbol.NormalizePrice(sl), m_symbol.NormalizePrice(tp)); } } //+------------------------------------------------------------------+ //| Refreshes the symbol quotes data | //+------------------------------------------------------------------+ bool RefreshRates(void) { //--- refresh rates if(!m_symbol.RefreshRates()) { Print("RefreshRates error"); return(false); } //--- protection against the return value of "zero" if(m_symbol.Ask()==0 || m_symbol.Bid()==0) return(false); //--- return(true); } //+------------------------------------------------------------------+ //| Checks if the specified filling mode is allowed | //+------------------------------------------------------------------+ bool IsFillingTypeAllowed(int fill_type) { //--- Obtain the value of the property that describes allowed filling modes int filling=m_symbol.TradeFillFlags(); //--- Return true, if mode fill_type is allowed return((filling & fill_type)==fill_type); } //+------------------------------------------------------------------+ //| Lot Check | //+------------------------------------------------------------------+ double LotCheck(double lots) { //--- calculate maximum volume double volume=NormalizeDouble(lots,2); double stepvol=m_symbol.LotsStep(); if(stepvol>0.0) volume=stepvol*MathFloor(volume/stepvol); //--- double minvol=m_symbol.LotsMin(); if(volume<minvol) volume=0.0; //--- double maxvol=m_symbol.LotsMax(); if(volume>maxvol) volume=maxvol; return(volume); } //+------------------------------------------------------------------+
У Вас баланс 1000 долларов , лот равен 1
в результате Ваш код будет пытаться войти в рынок 1000 лотами...
Lots - это переменная int
input int Lots=1000;
"Размерность" request.volume должно быть [lot] а у вас что то вроде [Money/lot]
Вот пример правильной размерности (Lots==1.0 будет равняться Левередж=1.0 относительно ваши деньги ) :
request.volume=Lots*AccountInfoDouble(ACCOUNT_BALANCE)/SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день! Уже который день бьюсь с данной проблемой.
Вот мой код:
Постоянно вылазит ошибка: failed market buy _____ EURUSD sl: ____ tp: ____ [Invalid volume]
Мне нужно, чтобы volume определялось как баланс деленное на Lots.