Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Ищешь единомышленников? На форуме их много!
skraber
19
skraber 2014.04.15 16:27 

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

#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);

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

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

Александр
82
Александр 2014.04.15 23:21  

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


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

skraber
19
skraber 2014.04.16 10:13  
EverAlex:

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


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



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

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

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

//****************Функция определения размера лота*******************|
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);
}//******************************************************************|
skraber
19
skraber 2014.04.16 14:08  
это все хорошо, а как мне связать свой стоп лос со стопом скрипта???? у меня постоянно выдает ошибку " не правильный лот" если я просто подставляю в функцию свой _sl . Я именно не понимаю как прописать это правильно... может типо int SL=_sl или как????
Alexey Viktorov
5194
Alexey Viktorov 2014.04.16 14:31  
Skraber:
это все хорошо, а как мне связать свой стоп лос со стопом скрипта???? у меня постоянно выдает ошибку " не правильный лот" если я просто подставляю в функцию свой _sl . Я именно не понимаю как прописать это правильно... может типо int SL=_sl или как????
Ну тогда разберись в том, что такое скрипт, что такое функция. Как это работает... или закажи то что тебе надо за деньги.
skraber
19
skraber 2014.04.16 18:02  
AlexeyVik:
Ну тогда разберись в том, что такое скрипт, что такое функция. Как это работает... или закажи то что тебе надо за деньги.

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


Не следует выставлять новичкам функции, обращающиеся к другим функциям, а потом корить их, что они бестолковы. Вашу функцию нельзя просто засунуть в любой советник, она не будет работать.
Alexey Viktorov
5194
Alexey Viktorov 2014.04.17 04:55  
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);
}//******************************************************************|
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий