Найдена ошибка по пути:
Учебник по 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 --
Как приятно, что новый посетитель начал с полезного ознакомления с сайтом! В добрый час!
Помогу ответственному за исправление этой ошибки найти её:
Как приятно, что новый посетитель начал с полезного ознакомления с сайтом! В добрый час!
А знаки расставить?
Уважаемые господа. Не хотел указывать на свою слабость в математике, думал, вы расставите.
Помогите разобраться.
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; ?
А откуда 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;
А откуда double Lot=MathFloor(Free*ProtsOne_LotStep)*Step ???
Я не знаю как указать строчку, но попробуйте найти на сайте через Ctrl+F по слову "ProtsOne_LotStep".
Как раз в двух местах ошибки.
то есть если имеем свободных средств 10000, 1 лот стоит 240, доля средств на торг=10% и мин.лот = 0,01 - то
(10000*10/240*0.01)=4,16666666666667,
Видимо, у вас тоже ошибка. 10% это 0.01.
Видимо, у вас тоже ошибка. 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
Я не знаю как указать строчку, но попробуйте найти на сайте через 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;
С чего бы это на 10000 при доле 10% брать лот 0.01???
Так в той статье смысл вот в чем:
"Пример простого скрипта, открывающего ордер Buy, стоимостью 35% от суммы свободных средств"
Поэтому в скрипте переменная Prots=0.35
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Найдена ошибка по пути:
Учебник по MQL -> Торговые операции -> Открытие и установка ордеров
в разделе Функция MarketInfo()
заменить страшную переменную ProtsOne_LotStep на три переменные (Prots, One_Lot, Step) с необходимыми мат. знаками (+/-/*//) .