Скачать MetaTrader 5

Ошибка в учебнике по MQL

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Интересуют возможности MQL5? Загляни в документацию!
Ruslan
61
Ruslan 2015.01.07 20:42 

Найдена ошибка по пути:

Учебник по MQL -> Торговые операции -> Открытие и установка ордеров 

в разделе Функция MarketInfo() 

заменить страшную переменную ProtsOne_LotStep на три переменные (Prots, One_Lot, Step) с необходимыми мат. знаками (+/-/*//) .

Boris
3901
Boris 2015.01.07 22:00  
solarplexus:

Найдена ошибка по пути:

Учебник по MQL -> Торговые операции -> Открытие и установка ордеров 

в разделе Функция MarketInfo() 

заменить страшную переменную ProtsOne_LotStep на три переменные (Prots, One_Lot, Step) с необходимыми мат. знаками (+/-/*//) .

Помогу ответственному за исправление этой ошибки найти её, а соответствующие знаки сам поставит:

//--------------------------------------------------------------------
// openbuystop.mq4 
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
int start()                                     // Спец.функция start
  {
   int Dist_SL =10;                             // Заданный SL (pt)
   int Dist_TP =3;                              // Заданный TP (pt)
   double Prots=0.35;                           // Процент своб. ср.
   string Symb=Symbol();                        // Финанс. инструмент
   double Win_Price=WindowPriceOnDropped();     // Здесь брошен скрипт
   Alert("Мышкой задана цена Price = ",Win_Price);// Задано мышей
//--------------------------------------------------------------- 2 --
   while(true)                                  // Цикл открытия орд.
     {
      int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Мин. дистанция
      double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер лота
      double Free   =AccountFreeMargin();       // Свободн средства
      double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Стоим.лота
      double Lot=MathFloor(Free*ProtsOne_LotMin_Lot)*Min_Lot;// Лоты  <<== тут!
      //--------------------------------------------------------- 3 --

Как приятно, что новый посетитель начал с полезного ознакомления с сайтом! В добрый час!

Vitalie Postolache
12099
Vitalie Postolache 2015.01.07 22:05  
borilunad:

Помогу ответственному за исправление этой ошибки найти её:

Как приятно, что новый посетитель начал с полезного ознакомления с сайтом! В добрый час!

А знаки расставить?
Boris
3901
Boris 2015.01.07 22:06  
evillive:
А знаки расставить?
..., а соответствующие знаки сам поставит!
Ruslan
61
Ruslan 2015.01.08 12:21  

Уважаемые господа. Не хотел указывать на свою слабость в математике, думал, вы расставите.

Помогите разобраться.

double Lot=MathFloor(Free*ProtsOne_LotStep)*Step; 

Допустим, свободных средств 1900 руб.

1900 * 0.35 = 665 руб (35%)

1 лот стоит 10 руб. 

665 /  10 = 66.5 лотов в 665-ти рублях.

А дальше что? Для чего Step?

И чем отличается строчка  double Lot=MathFloor(Free*ProtsOne_LotMin_Lot)*Min_Lot; ?

Vitalie Postolache
12099
Vitalie Postolache 2015.01.08 13:09  

А откуда double Lot=MathFloor(Free*ProtsOne_LotStep)*Step ???

В коде, предположительно:

double Lot=MathFloor(Free*Prots/One_Lot*Min_Lot)*Min_Lot;

то есть если имеем свободных средств 10000, 1 лот стоит 240 (на евродолларе при плече 1:500, например), доля средств на торг=10% и мин.лот = 0,01 - то

(10000*10/240*0.01)=4,16666666666667,

в коде значение обрезается до нижнего целого, значит лот=4*0,01=0,04


Пы.Сы: хотя да, я бы расчёт переделал на шаг лота, а не на мин.лот, все-таки есть ДЦ, где шаг лота больше мин. лота, например, мин.лот=0,01 а шаг=0,05.

double step=MarketInfo(Symb,MODE_LOTSTEP);// Мин. размер лота
...
      double Lot=MathFloor(Free*Prots/One_Lot*step)*step;

Ruslan
61
Ruslan 2015.01.08 13:44  
evillive:

А откуда double Lot=MathFloor(Free*ProtsOne_LotStep)*Step ???

Я не знаю как указать строчку, но попробуйте найти на сайте через Ctrl+F по слову "ProtsOne_LotStep".

Как раз в двух местах ошибки. 

Ruslan
61
Ruslan 2015.01.08 13:51  
evillive:

то есть если имеем свободных средств 10000, 1 лот стоит 240, доля средств на торг=10% и мин.лот = 0,01 - то

(10000*10/240*0.01)=4,16666666666667,

Видимо, у вас тоже ошибка. 10% это 0.01.

Vitalie Postolache
12099
Vitalie Postolache 2015.01.08 14:18  
solarplexus:

Видимо, у вас тоже ошибка. 10% это 0.01.

С чего бы это на 10000 при доле 10% брать лот 0.01???

Нет, тут надо задавать именно в %, то есть 0-100, а не в дробях, а то там лот будет отличаться от минимального только для очень больших депозитов

если 10% считать как 0.1 - то (10000*0.1/240)*0.03=0.125 и лот=0*0.03=0 (не забываем, там MathFloor) - значит надо мин.лот брать

более того, даже при (80000*0.1/240)*0.03=0.999999999999999 - тоже в результате лот будет минимальный.

А какой смысл при капитале 80000 с плечом 1:500 торговать лотом 0.01

Vitalie Postolache
12099
Vitalie Postolache 2015.01.08 14:36  

solarplexus:

Я не знаю как указать строчку, но попробуйте найти на сайте через Ctrl+F по слову "ProtsOne_LotStep".

Как раз в двух местах ошибки. 

Нашёл, действительно ещё и вторая опечатка есть:

Функция MarketInfo()

   while(true)                                  // Цикл открытия орд.
     {
      int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Мин. дистанция
      double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер лота
      double Step   =MarketInfo(Symb,MODE_LOTSTEP);//Шаг изменен лотов
      double Free   =AccountFreeMargin();       // Свободн средства
      double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Стоим.1 лота
      //--------------------------------------------------------- 3 --
      double Lot=MathFloor(Free*ProtsOne_LotStep)*Step;               //наверное Lot=MathFloor(Free*Prots/One_Lot*Step)*Step;

Функция WindowPriceOnDropped()

   while(true)                                  // Цикл открытия орд.
     {
      int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Мин. дистанция
      double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер лота
      double Free   =AccountFreeMargin();       // Свободн средства
      double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Стоим.лота
      double Lot=MathFloor(Free*ProtsOne_LotMin_Lot)*Min_Lot;           //наверное Lot=MathFloor(Free*Prots/One_Lot*Min_Lot)*Min_Lot; 

Ruslan
61
Ruslan 2015.01.08 15:52  
evillive:

С чего бы это на 10000 при доле 10% брать лот 0.01???

Так в той статье смысл вот в чем:

"Пример простого скрипта, открывающего ордер Buy, стоимостью 35% от суммы свободных средств

Поэтому в скрипте переменная Prots=0.35 

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий