Помогите с расчетом лота по стоп лос.

 

Есть такой скрипт по расчету лота по стоп лосу

#property copyright "Copyright © 2010."

#property link "http://mql4you.ru"

#property show_inputs

extern int MaxRisk=2;

extern int StopLoss=100;

//+------------------------------------------------------------------+

int start()

{double Free =AccountFreeMargin();

double LotVal =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта 1 лота

double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);

double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);

double Step =MarketInfo(Symbol(),MODE_LOTSTEP);

double Lot =MathFloor((Free*MaxRisk/100)/(StopLoss*LotVal)/Step)*Step;

if(Lot<Min_Lot) Lot=Min_Lot;

if(Lot>Max_Lot) Lot=Max_Lot;

Alert(Lot);

return(0);}

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

Не могу связать StopLoss скрипта с рассчитываемым в советнике _sl=NormalizeDouble(_price+((y1-y2)*10000*Point),Digits);

соответственно ордер выставляется вот так ticket=OrderSend(Symbol(),_extType,Lot,_price,5,_sl,_tp," ",MAGICMA,0,0);

Я обычно не пишу советников поэтому прошу помощи...

что нужно сделать???

 

А это чем не годится?


PS: а вот это лучше не использовать - там ошибочное предположение, что POINT всегда совпадает с TICKSIZE (там ниже есть по этому поводу)

 
EverAlex:

А это чем не годится?


PS: а вот это лучше не использовать - там ошибочное предположение, что POINT всегда совпадает с TICKSIZE (там ниже есть по этому поводу)



Спасибо, а какой функцией приравнять SL из скрипта к моему _sl ? подскажите пожалуйста, дайте кусочек кода...
 

Вот ещё мой вариант. Работает без проблем.

Функция в отдельной библиотеке, поэтому в неё передаётся символ.

//****************Функция определения размера лота*******************|
double RiskLots(string symbol     // это понятно
              , double Risk       // это тоже
              , double StopLoss   // количество пунктов (OrderOpenPrice() - OrderStopLoss())
              , double Lots)      // Размер лота по умолчанию, если Risk = 0
{
  double dx, TICKVALUE, Lot, Equity, MAXLOT, LOTSTEP;
   TICKVALUE = MarketInfo(symbol, MODE_TICKVALUE);
   LOTSTEP = (MarketInfo(symbol, MODE_LOTSTEP) == 0.1)?1:2;
     dx = AccountFreeMargin()*Risk/100;
      if(Risk > 0)
         {
   Equity = AccountFreeMargin();
   MAXLOT = NormalizeDouble(Equity*AccountLeverage()/MarketInfo(symbol, MODE_LOTSIZE), LOTSTEP);
         Lot = NormalizeDouble((dx*Point/nd(StopLoss*TICKVALUE)), LOTSTEP);
   if(Lot > MAXLOT) {Lot = MAXLOT; Print("MAXLOT = ", MAXLOT);}
         if(Lot < MarketInfo(symbol, MODE_MINLOT)) Lot = Lots;
         if(Lot > MarketInfo(symbol, MODE_MAXLOT)) Lot = MarketInfo(symbol, MODE_MAXLOT);
      return(Lot);
         }
      else return(Lots);
}//******************************************************************|
 
это все хорошо, а как мне связать свой стоп лос со стопом скрипта???? у меня постоянно выдает ошибку " не правильный лот" если я просто подставляю в функцию свой _sl . Я именно не понимаю как прописать это правильно... может типо int SL=_sl или как????
 
Skraber:
это все хорошо, а как мне связать свой стоп лос со стопом скрипта???? у меня постоянно выдает ошибку " не правильный лот" если я просто подставляю в функцию свой _sl . Я именно не понимаю как прописать это правильно... может типо int SL=_sl или как????
Ну тогда разберись в том, что такое скрипт, что такое функция. Как это работает... или закажи то что тебе надо за деньги.
 
AlexeyVik:
Ну тогда разберись в том, что такое скрипт, что такое функция. Как это работает... или закажи то что тебе надо за деньги.

Спасибо за обширный ответ! Красавчик! из за двух строчек буду советник заказывать)) Молодец! здорово придумал! У меня есть рабочий советник мой, написанный мной же и всего лишь на всего мне нужно понять как приравнять стоп лос моего советника со стоп лосом скрипта (спасибо за твою версию скрипта, но она мне не очень нравится, апонент выше дал ссылку на более правильную логику скрипта), и форум то для этого и нужен чтоб помогать друг другу.... умник...
 
AlexeyVik:
Ну тогда разберись в том, что такое скрипт, что такое функция. Как это работает... или закажи то что тебе надо за деньги.


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

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

Ну не уследил... виноват, маленько...

А то, что я не стал разжёвывать про стоплосс, так это надо просто прочесть комментарии которые я написал специально для того поста где предложил этот код

//****************Функция определения размера лота*******************|
double RiskLots(string symbol     // это понятно
              , double Risk       // это тоже
              , double StopLoss   // количество пунктов (OrderOpenPrice() - OrderStopLoss())
              , double Lots)      // Размер лота по умолчанию, если Risk = 0
{
  double dx, TICKVALUE, Lot, Equity, MAXLOT, LOTSTEP;
   TICKVALUE = MarketInfo(symbol, MODE_TICKVALUE);
   LOTSTEP = (MarketInfo(symbol, MODE_LOTSTEP) == 0.1)?1:2;
     dx = AccountFreeMargin()*Risk/100;
      if(Risk > 0)
         {
   Equity = AccountFreeMargin();
   MAXLOT = NormalizeDouble(Equity*AccountLeverage()/MarketInfo(symbol, MODE_LOTSIZE), LOTSTEP);
         Lot = NormalizeDouble((dx*Point/(StopLoss*TICKVALUE)), LOTSTEP);// Здесь нашёл... исправил. Она в общем-то и не нужна тут
   if(Lot > MAXLOT) {Lot = MAXLOT; Print("MAXLOT = ", MAXLOT);}
         if(Lot < MarketInfo(symbol, MODE_MINLOT)) Lot = Lots;
         if(Lot > MarketInfo(symbol, MODE_MAXLOT)) Lot = MarketInfo(symbol, MODE_MAXLOT);
      return(Lot);
         }
      else return(Lots);
}//******************************************************************|
Причина обращения: