Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 565

 
PolarSeaman:

Вы заменили в коде 

на

но, это не помогло)

Сочувствую,что Вы заметили только это)

 
Alekseu Fedotov:

FileSeek() с флагом  SEEK_END, вам поможет.

<

Спасибо!Попробую!

 
YanSay:

Добрый вечер!

Ломаю голову как дописать универсальный (для разных инструментов) код для расчета лота для сделки исходя из % от депозита.

Сделал так:

Price (цена открытия позиции) и SL (стоп лосс) отдельно рассчитываются, не стал сюда добавлять. 

Для пар где валюта котировки в долларах (например EURUSD), для индекса SPX500 и для золота - все правильно рассчитывает, но для пар где доллар стоит первый в котировке (например USDJPY) не работает.

Подскажите пожалуйста, что упустил?

Обратите внимание на нормализацию

В переменной _Digits хранится количество десятичных знаков после запятой, определяющее точность измерения цены символа текущего графика. 

 
Alekseu Fedotov:

Обратите внимание на нормализацию

В переменной _Digits хранится количество десятичных знаков после запятой, определяющее точность измерения цены символа текущего графика. 

Благодарю! Вот так переделал:

input double MaximumRisk=0.02;                  //Риск в сделке от депозита

//1ый вариант
{Lots = NormalizeDouble(((AccountBalance()*MaximumRisk)/((MathAbs(Price-SL))/Point)/((MarketInfo(Symbol(),MODE_LOTSIZE)*(MarketInfo(Symbol(),MODE_ASK)+Point))
-(MarketInfo(Symbol(),MODE_LOTSIZE)*MarketInfo(Symbol(),MODE_ASK)))),
int(MathAbs(log(MarketInfo(Symbol(), MODE_LOTSTEP)))));}

//2ой вариант
{Lots = NormalizeDouble((AccountBalance()*MaximumRisk)/((MathAbs(Price-SL))/Point)/((MarketInfo(Symbol(),MODE_TICKVALUE))),
int(MathAbs(log(MarketInfo(Symbol(), MODE_LOTSTEP)))));}

В 1ом варианте: EURUSD и XAUUSD - все правильно; USDJPY - вместо 2% от депозита рискует 0,2% от депозита; а в случае с SPX500 и BRN вообще выдает OrderSend error 131 (ошибку с расчетом лота).

Во 2ом варианте: EURUSD, XAUUSD и USDJPY - все правильно; SPX500 - вместо 2% от депозита рискует 20% от депозита; а в случае с BRN вообще выдает OrderSend error 131 (ошибку с расчетом лота).

Где-то еще ошибка, не могу понять в каком месте, подскажите пожалуйста.

 
YanSay:

Благодарю! Вот так переделал:

В 1ом варианте: EURUSD и XAUUSD - все правильно; USDJPY - вместо 2% от депозита рискует 0,2% от депозита; а в случае с SPX500 и BRN вообще выдает OrderSend error 131 (ошибку с расчетом лота).

Во 2ом варианте: EURUSD, XAUUSD и USDJPY - все правильно; SPX500 - вместо 2% от депозита рискует 20% от депозита; а в случае с BRN вообще выдает OrderSend error 131 (ошибку с расчетом лота).

Где-то еще ошибка, не могу понять в каком месте, подскажите пожалуйста.

Замените Point, на MarketInfo(Symbol(), MODE_POINT)

 
Vitaly Muzichenko:

Замените Point, на MarketInfo(Symbol(), MODE_POINT)

А смысл? Если все по символу графика рассчитывается. Это имеет смысл если мультивалюка и рассчитывается Symbol отличный от текущего графика.

 
Vitaly Muzichenko:

Замените Point, на MarketInfo(Symbol(), MODE_POINT)

К сожалению не помогло(

И в информации к MODE_POINT написано "Размер пункта в валюте котировки. Для текущего инструмента хранится в предопределенной переменной Point"

Судя по описанию без разницы в каком варианте использовать. Но попробовал и не помогло.


 

Подскажите, возможно ли на кнопку в эксперте поставить "выбор" графического инструмента, так чтобы нажав на кнопку  под курсором появлялся значок инструмента и его можно было бы натягивать?

Причем чтобы канал уже с заданными свойствами был

 
Roman Sharanov:

Подскажите, возможно ли на кнопку в эксперте поставить "выбор" графического инструмента, так чтобы нажав на кнопку  под курсором появлялся значок инструмента и его можно было бы натягивать?

Причем чтобы канал уже с заданными свойствами был

Возможно

 
YanSay:

К сожалению не помогло(

И в информации к MODE_POINT написано "Размер пункта в валюте котировки. Для текущего инструмента хранится в предопределенной переменной Point"

Судя по описанию без разницы в каком варианте использовать. Но попробовал и не помогло.

Попробуйте функцию:

//===============================================================================================
//------------------------------ Расчет лота по риску на StopLoss -------------------------------+
//===============================================================================================
double sLot(double Percent=1, double Stloss=100, string symb="0") {
 if(symb=="0") symb=Symbol();
 double TickValue   =SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_VALUE),
        TickSize    =SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_SIZE),
        ContractSize=SymbolInfoDouble(symb,SYMBOL_TRADE_CONTRACT_SIZE),
        Min_Lot     =SymbolInfoDouble(symb,SYMBOL_VOLUME_MIN),
        Max_Lot     =SymbolInfoDouble(symb,SYMBOL_VOLUME_MAX),
        Step        =SymbolInfoDouble(symb,SYMBOL_VOLUME_STEP),
        Free        =AccountInfoDouble(ACCOUNT_FREEMARGIN),
        Lots_New    =0.0;
 int CalcMode=(int)SymbolInfoInteger(symb,SYMBOL_TRADE_CALC_MODE);

  if(Percent > 100) Percent = 100;
  if(Stloss <=0) return(0);
  if(Percent == 0) Lots_New = Min_Lot;
   else {
    if(CalcMode==0 || CalcMode==4)
      Lots_New = MathFloor((((Free*Percent/100)/Stloss)/TickValue)/Step)*Step;
    if(CalcMode==1||CalcMode==2||CalcMode==3)
      Lots_New = MathFloor(((((Free*Percent)/100)/Stloss)/((TickSize*TickValue)*ContractSize/TickValue))/Step)*Step;
   }
   if(Lots_New > Max_Lot) Lots_New = Max_Lot;
   if(Lots_New < Min_Lot) return(0);
  return(NormalizeDouble(Lots_New,/*LotDigit()*/ 2));
 }
Причина обращения: