вопрос по OrderSend

 

Добрый день! Уже который день бьюсь с данной проблемой. 

Вот мой код:

    MqlTradeRequest request={0};
    request.action=TRADE_ACTION_DEAL;    
    request.magic=Magic;   
    request.symbol=_Symbol;  
    request.volume=AccountInfoDouble(ACCOUNT_BALANCE)/Lots; 
    request.sl=SymbolInfoDouble("EURUSD",SYMBOL_BID)-100*_Point; 
    request.tp=SymbolInfoDouble("EURUSD",SYMBOL_BID)+100000*_Point;
    request.deviation=1;
    request.type=ORDER_TYPE_BUY;
    request.type_filling=ORDER_FILLING_FOK;
    request.price=SymbolInfoDouble("EURUSD",SYMBOL_ASK); 
    MqlTradeResult result={0};
    OrderSend(request,result);

Постоянно вылазит ошибка: failed market buy _____ EURUSD sl: ____ tp: ____ [Invalid volume]

Мне нужно, чтобы volume определялось как баланс деленное на Lots.

Мне сказали нужно использовать CSymbolInfo::NormalizePrice, как я не пробовал, но ошибка не уходит. Заранее спасибо.
 
labvic:

Добрый день! Уже который день бьюсь с данной проблемой. 

Вот мой код:

Постоянно вылазит ошибка: failed market buy _____ EURUSD sl: ____ tp: ____ [Invalid volume]

Мне нужно, чтобы volume определялось как баланс деленное на Lots.

Мне сказали нужно использовать CSymbolInfo::NormalizePrice, как я не пробовал, но ошибка не уходит. Заранее спасибо.
request.volume=AccountInfoDouble(ACCOUNT_BALANCE)/Lots; 


У Вас баланс 1000 долларов , лот равен 1 

в результате Ваш код будет пытаться войти в рынок 1000 лотами...

 
labvic:

Добрый день! Уже который день бьюсь с данной проблемой. 

Вот мой код:

Постоянно вылазит ошибка: failed market buy _____ EURUSD sl: ____ tp: ____ [Invalid volume]

Мне нужно, чтобы volume определялось как баланс деленное на Lots.

Мне сказали нужно использовать CSymbolInfo::NormalizePrice, как я не пробовал, но ошибка не уходит. Заранее спасибо.

Запустите этот пример - в нём стопы и лот нормализованы:

//+------------------------------------------------------------------+
//|                                                          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);
  }
//+------------------------------------------------------------------+
Файлы:
123.mq5  10 kb
 
Vladimir Pastushak:


У Вас баланс 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);