Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 852

 

Не открывает сделку, где косяк?

iRSI_handle=iRSI(NULL,0,15,PRICE_OPEN);

double iRSI_buf[];

ArraySetAsSeries(iRSI_buf,true);

CopyBuffer(iRSI_handle,0,0,20,iRSI_buf);

if (iRSI_buf[0]>60)

trader.Buy(Lot);
 
Askr:

Не открывает сделку, где косяк?

Косяк номер 1: НА каждом тике Вы создаёте НОВЫЙ ХЕНДЛ индикатора

Косяк номер 2: (вероятно) переменная Lot имеет некорректный объём.

Косяк номер 3: (вероятно) не заполнено тип заливки ордеров для класса CTrade.


В общем, что в журнале терминала (или тестера)?

 
Kirill Belousov:

сумму умножаете на убыток в валюте от 1 СЛ 

А если убыток равен 1, в БО например.

Подставляю в формулу значения, даже близко не тот результат.

Что не так?

double lot=1.0;
double koef_lot=2.0;
int seriya =15;
double depo=0.0;
depo=(lot*(koef_lot*seriya-1))/(koef_lot-1);
   Comment(" depo ",depo);
 
Vladimir Karputov:

Косяк номер 1: НА каждом тике Вы создаёте НОВЫЙ ХЕНДЛ индикатора

Косяк номер 2: (вероятно) переменная Lot имеет некорректный объём.

Косяк номер 3: (вероятно) не заполнено тип заливки ордеров для класса CTrade.


В общем, что в журнале терминала (или тестера)?

Вот этот код да был в онтике

ArraySetAsSeries(iRSI_buf,true);

CopyBuffer(iRSI_handle,0,0,20,iRSI_buf);

Перенёс в онинит. Просто я читал тут статьи - а из них я понял что разницы для работы нет но лучше в онтикет. Но с точки зрения наглядности для себя мне было удобнее сразу всё 1 блоком сделать, я чисто для себя пока решаю задачки которые сам себе ставлю(обучаюсь.)

Проблёма была с лотом-там нужно было ставить не переменную лот- а функцию возвраталот( т.к. была функция для расчёта лота).

Сейчас вот обнаружил и в функции лота недочёт- идёт расчёт вида с кучей знаков после запятой и по итогу сделка не может открыться. Нужно сделать сокращение ненужных символов и оставить только 2.

//параметры
input double      StartLot=0.1;
input double      StartEquityLot=10000;

//переменные
double KoefLotEQUITY;//разница эквити
double Lot;

//функция расчета текущего торгового лота
double LotF(double Lot)
{
KoefLotEQUITY=AccountInfoDouble(ACCOUNT_EQUITY)/ StartEquityLot;
Lot=StartLot*KoefLotEQUITY;
//функция минимального возможного лота
if (Lot<0.01)
{
Lot=0.01;
}

return(Lot);
} 

NormalizeDouble и DoubleToStr пока не получается-пишет что нельзя вкладывать функцию в функцию.-а ниже когда вставляю их работу с функцией пишет ошибки- которые исправитьне могу.


 
Askr:

Вот этот код да был в онтике

Перенёс в онинит. Просто я читал тут статьи - а из них я понял что разницы для работы нет но лучше в онтикет. Но с точки зрения наглядности для себя мне было удобнее сразу всё 1 блоком сделать, я чисто для себя пока решаю задачки которые сам себе ставлю(обучаюсь.)

Проблёма была с лотом-там нужно было ставить не переменную лот- а функцию возвраталот( т.к. была функция для расчёта лота).

Сейчас вот обнаружил и в функции лота недочёт- идёт расчёт вида с кучей знаков после запятой и по итогу сделка не может открыться. Нужно сделать сокращение ненужных символов и оставить только 2.

NormalizeDouble и DoubleToStr пока не получается-пишет что нельзя вкладывать функцию в функцию.-а ниже когда вставляю их работу с функцией пишет ошибки- которые исправитьне могу.


В MQL5 создавать хендл индикатора НУЖНО ОДИН РАЗ и ТОЛЬКО В OnInit. Это аксиома. Нельзя создавать хендл индикатора в OnTick на каждом тике - это НЕПРАВИЛЬНО.

Правильная нормализация лота есть в торговом классе CSymbolInfo::NormalizePrice

 
Vladimir Karputov:

В MQL5 создавать хендл индикатора НУЖНО ОДИН РАЗ и ТОЛЬКО В OnInit. Это аксиома. Нельзя создавать хендл индикатора в OnTick на каждом тике - это НЕПРАВИЛЬНО.

Правильная нормализация лота есть в торговом классе CSymbolInfo::NormalizePrice

Неправильно, с этим не спорю. НО!!! А что изменится если создавать на каждом тике??? Даже значение не изменится.

 
Alexey Viktorov:

Неправильно, с этим не спорю. НО!!! А что изменится если создавать на каждом тике??? Даже значение не изменится.

А смысл? Только лишнюю работу делать скрипту и все.

 
Alexey Viktorov:

Неправильно, с этим не спорю. НО!!! А что изменится если создавать на каждом тике??? Даже значение не изменится.

В одной своей недавней статье я показал, что MQL5 эффективно борется с перижитками кодирования в стиле MQL4 - с созданием хендлов на каждом тике: память уже не отжирается, но как минимум падает скорость работы. Но, повторюсь: создание индикаторов на языке MQL5 в стиле MQL4 - это неправильный метод. Если перешли на MQL5 значит нужно перестраивать стилистику программирования.

 
Konstantin Nikitin:

А смысл? Только лишнюю работу делать скрипту и все.

Конечно никакого смысла. Это был такой скрытый вопрос барабашке: Зачем уподобляться неврастеникам, коих тут и так достаточно, и включать Caps Lock?

 

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

Хоть бы в статье додумывались об этом писать-хотя в целом и так понятно что зачем делать одно и то же несколько раз.

Но у меня была цель написать чтобы самому понять и работало а не оптимизировать-это после считал.
Причина обращения: