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

 
Tanita Gajduchok:
Привет.Как здесь сделать лидерский счет?

топ ?

 
Приветствую!

Как написать вот такую функцию:

Сумма ростущего свечного объема должна превышать в 2 раза сумму нисходящего объема, например за последние 10 баров. 

Типа того что на скрине. 


Файлы:
IMG_9206.PNG  87 kb
 

Всем добрый день. Пытаюсь в Грааль машину прикрутить расчёт размера лота, чтобы лот выставлялся в процентах от депозита при потере. То есть если срабатывает стоп лос то от депозита теряется заданный процент, либо если депозит маленький для этого процента то лот выставляется минимально возможный для брокера… нашёл на каком-то сайте описание скрипта, который подобное делает и перенёс код скрипта к себе, но лот считается не корректно. .сделал так. Во входные переменные объявил переменную отвечающую за максимальный риск.

extern int MaxRisk=1;// МАКСИМАЛЬНЫЙ % УБЫТКА ПРИ СТОП ЛОССЕ?

Далее в он тик объявляю переменные. Переменную которая хранит в себе размер свободных средств на счёте. Переменную стоимости одного пункта по инструменту. Переменную минимального лота у брокера. Переменную которая хранит значение максимального лота у брокера. И переменную которая хранит шаг размера лота.

  double Free =AccountFreeMargin();// ПОЛУЧАЕМ СВОБОДНЫЕ СРЕДССТВА ДЛЯ РАСЧЁТА ОБЪЁМА ЛОТА
  double LotVal =MarketInfo(Symbol(),MODE_TICKVALUE); //СТОИМОСТЬ 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)/(sl*LotVal)/Step)*Step; //СТРАШНАЯ ФОРМУЛА РАСЧЁТА ОБЪЁМА ЛОТА, КОТОРУЮ Я СОВСЕМ НЕ ПОНИМАЮ((((
  if(lot<Min_Lot) lot=Min_Lot; //ЕСЛИ ЛОТ ПОЛУЧИЛСЯ МЕНЬШЕ ЧЕМ МИНИМАЛЬНЫЙ ЛОТ У БРОКЕРА ТО ЛОТ ПРИСВАЕМАЕМ МИНИМАЛЬНЫЙ ЛОТ У БРОКЕРА
if(lot>Max_Lot) lot=Max_Lot;  //ЕСЛИ ЛОТ ПОЛУЧИЛСЯ БОЛЬШЕ ЧЕМ МАКСИМАЛЬНЫЙ ЛОТ У БРОКЕРА ТО ОЛТ ПРИСВАЕВАЕМ МАКС ЛОТ У БРОКЕРА

 


 После всех расчётов через принт вывожу значение лота, чтобы посмотреть его.

Print("ЛОТ ДО НОРМАЛИЗАЦИИ= "+lot);
 lot=NormalizeDouble(lot,Digits());
Print("ЛОТ ПОСЛЕ НОРМАЛИЗАЦИИ= "+lot);

Что выводится в журнале что выводится по лоту и стопу в журнал- значения стопа корректные, а вот лота нет((((

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
Информация о счете - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
DanilaMactep:

Всем добрый день. Пытаюсь в Грааль машину прикрутить расчёт размера лота, чтобы лот выставлялся в процентах от депозита при потере. То есть если срабатывает стоп лос то от депозита теряется заданный процент, либо если депозит маленький для этого процента то лот выставляется минимально возможный для брокера… нашёл на каком-то сайте описание скрипта, который подобное делает и перенёс код скрипта к себе, но лот считается не корректно. .сделал так. Во входные переменные объявил переменную отвечающую за максимальный риск.

Далее в он тик объявляю переменные. Переменную которая хранит в себе размер свободных средств на счёте. Переменную стоимости одного пункта по инструменту. Переменную минимального лота у брокера. Переменную которая хранит значение максимального лота у брокера. И переменную которая хранит шаг размера лота.

А далее расчитывается объём лота с заданным риском при определённом стоп лоссе. Стоп лосс рассчитывается по атр либо фиксированный в пунктах- этот расчёт работает правильно т.к если лот ставлю фиксированный то всё хорошо открывается и работает. Сама формула расчёта объёма лота вот такая.


 После всех расчётов через принт вывожу значение лота, чтобы посмотреть его.

Что выводится в журнале можно посмотреть по ***

На первый взгляд функция нормальная. Только в формулу надо вставлять sl не цену стоплосса ордера, а расстояние от открытия ордера до стопа в пунктах.

Дальше: нормализовать лот надо до точности не _Digits в до Step — (ШАГ ИЗМЕНЕНИЯ РАЗМЕРА ЛОТА) и в Print надо выводить через DoubleToString() с той-же точностью, тогда увидите то что хотели увидеть.

 
DanilaMactep:

Всем добрый день. Пытаюсь в Грааль машину прикрутить расчёт размера лота,

Я себе сделал так

Order_Lots = NormalizeDouble((AccountBalance()/100*Percen)/(MarketInfo(Symbol(),MODE_TICKVALUE)*Stop_Point)-0.005,2);
 
Alexey Viktorov:

На первый взгляд функция нормальная. Только в формулу надо вставлять sl не цену стоплосса ордера, а расстояние от открытия ордера до стопа в пунктах.

Дальше: нормализовать лот надо до точности не _Digits в до Step — (ШАГ ИЗМЕНЕНИЯ РАЗМЕРА ЛОТА) и в Print надо выводить через DoubleToString() с той-же точностью, тогда увидите то что хотели увидеть.

С математикой у меня плоховасто- каким образом в коде высчитать растояние от открытия ордера до стопа, чтобы подставить вместо sl? вывод сделал вот так

DoubleToString("ЛОТ ПОСЛЕ НОРМАЛИЗАЦИИ= "+lot);// ВЫВОД ЗНАЧЕНИЯ ЛОТА
Анормализовал значение лота вот так
lot=NormalizeDouble(lot,Step);// НОРМАЛИЗАЦИЯ ЗНАЧЕНИЯ ЛОТА 

Получается остаётся понять как в коде высчитать растояние от открытия до стопа?

 
DanilaMactep:

Получается остаётся понять как в коде высчитать растояние от открытия до стопа?

if(buy)
Stop_Point= (Pric_UP-Loss_UP)/Point+Spread; 
else
Stop_Point= (Loss_DN-Pric_DN)/Point+Spread; 
 
MakarFX:

Большое спасибо за кусок кода, но вопрос теперь заключается в том какими типами объявлять переменные из этого куска кода и какие значения в них присваивать? Я ж не волшебник, а только учусь

 
DanilaMactep:

Большое спасибо за кусок кода, но вопрос теперь заключается в том какими типами объявлять переменные из этого куска кода и какие значения в них присваивать? Я ж не волшебник, а только учусь

Pric_UP

цена открытия покупок

Loss_UP

цена стоплосса покупок

   Spread = StrToInteger(DoubleToString(MarketInfo(Symbol(),MODE_SPREAD),0));
спред 
 
Порт-моне тв:
Приветствую!

Как написать вот такую функцию:

Сумма ростущего свечного объема должна превышать в 2 раза сумму нисходящего объема, например за последние 10 баров. 

Типа того что на скрине. 


мне кто-то помочь может?