Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 306
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
А другого и быть не может. Ни один компьютер не знает года меньше 1970. Начните с года который присутствует в котировках брокера.
Код в MT5
Результат:
ЗЫ: Код поменял - не из того ME был.Я не сразу понял задуманное. В mql5 я не делал этого, надо будет разобраться. А вот в mql4 сделать можно примерно так:
Завести ещё 2 дополнительных буфера.
Установить им смещение на N баров и заполнять эти N баров последним значением основных буферов.
И конечно-же индекс N+1 этих дополнительных буферов заполнять пустым значением.
Я не сразу понял задуманное. В mql5 я не делал этого, надо будет разобраться. А вот в mql4 сделать можно примерно так:
Завести ещё 2 дополнительных буфера.
Установить им смещение на N баров и заполнять эти N баров последним значением основных буферов.
И конечно-же индекс N+1 этих дополнительных буферов заполнять пустым значением.
Спасибо за идею - я так делал изначально в MT5, потом оптимизировал.
В общем в 4 утра лег спать (публичный код не полный, конечно), но сделал, то что хотел с двумя буферами.
Проблема была в том, что в MT5 заполнение происходит с лева на право, а в MT4 - наоборот. Функция ArraySetAsSeries не помогла - переписал логику всю фактически.
Добрый день, Артем!
Хотел бы обратиться за помощью со своей переделкой TrExp_Nik верс. 4 из стандартного кода эксперта, взятого из книги MQL 4. Хотел бы в него добавить возможность сдвигать в безубыток, то своими ограниченными возможностями с программированием это не получается. Решил за основу взять e-MovingInWL, код которого пробую интегрировать в свой эксперт, но получается корректно совместить переменные или я неправильно понимаю код второго эксперта по безубытку. Возможно, это не оптимальный вариант. Тогда хотел бы попросить совета, как можно было сделать лучше или проще.
Добрый день, Артем!
Хотел бы обратиться за помощью со своей переделкой TrExp_Nik верс. 4 из стандартного кода эксперта, взятого из книги MQL 4. Хотел бы в него добавить возможность сдвигать в безубыток, то своими ограниченными возможностями с программированием это не получается. Решил за основу взять e-MovingInWL, код которого пробую интегрировать в свой эксперт, но получается корректно совместить переменные или я неправильно понимаю код второго эксперта по безубытку. Возможно, это не оптимальный вариант. Тогда хотел бы попросить совета, как можно было сделать лучше или проще.
Добрый день. А что именно вы сами пытались сделать? Я вижу лишь два приложенных кода. Если вам нужно чтобы кто-то всё сделал для вас, то для этого есть фриланс.
А если сами пытаетесь, то покажите что именно делаете, и где не понимаете.
Здравствуйте,
Можно ли как-то программно добраться до свойств графического объекта "треугольник", размещенного на графике? Имеются в виду временные и ценовые координаты вершин, что отображаются на вкладке "Параметры" при интерактивном открытии формы свойств. Пробовал использовать функции ObjectGetInteger и ObjectGetDouble, но с их помощью удается получить данные только по одной вершине.
Спасибо.
Здравствуйте,
Можно ли как-то программно добраться до свойств графического объекта "треугольник", размещенного на графике? Имеются в виду временные и ценовые координаты вершин, что отображаются на вкладке "Параметры" при интерактивном открытии формы свойств. Пробовал использовать функции ObjectGetInteger и ObjectGetDouble, но с их помощью удается получить данные только по одной вершине.
Спасибо.
Можно. И направление мысли верное. Покажите как пытались взять параметры?
При выборе ордера по тикету указывать pool не нужно - MODE_TRADES тут лишнее - этот параметр при выборе по тикету игнорируется, и ордер выбирается из одного из двух списков - из списка закрытых, или из списка рыночных позиций - зависит от того - закрыта позиция, или ещё нет.
После успешного выбора ордера по тикету, для того, чтобы понять из какого из двух списков выбран ордер, нужно проверить время закрытия позиции - если оно больше нуля, то ордер уже закрыт, и был выбран из списка исторических ордеров, иначе - ордер ещё в рынке.
А вот для того, чтобы понять в чём у вас ошибка, вы должны приложить код - дать больше информации, так как в данной строке в принципе нет ошибки (кроме того, что не проверяете результат возврата функции, используете игнорируемый в данном случае модификатор и нет ";" после закрывающей скобки).
Спасибо, большое за ответ.
Вот вся функция, смысл в том, что она открывает ордер, а затем через модификацию добавляет постоянные значения стоп лосс и тейк профит.
Так вот, ордер открывается а стоп лосс и текй профит не проставляются (функцию расчета выделил красным, вот в ней то и OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES) выдает ошибку((( )
// функция открытия ордера, переменные: символ, тип ордера, лот, цена открытия, метод расчета ТП и СЛ (0 - задан в цене, 1 - задан в пунктах которые нужно рассчитать от цены открытия), стоп лосс, тейк профит)
//Символ/Пара, тип открываемого ордера - отложенный, Цена открытия, Переключатель = 1, SL B TP - величины стоп лосса и текйпрофита постоянные!!!
bool SendOrder(string Symb,int Type, double OP,int Mode) {
color CL;
double Pp = MarketInfo(Symb, MODE_POINT);
if (Type==0) CL=Blue;
if (Type==1) CL=Red;
if (Type==2 || Type==4) CL=DarkTurquoise;
if (Type==3 || Type==5) CL=Orange;
// првоерка объема
if(MarketInfo(Symb,MODE_LOTSTEP)==0.01) DG=2; else DG=1;
if (Lot<MarketInfo(Symb,MODE_MINLOT)) Lot=MarketInfo(Symb,MODE_MINLOT);
if (Lot>MarketInfo(Symb,MODE_MAXLOT)) Lot=MarketInfo(Symb,MODE_MAXLOT);
if (Lot*MarketInfo(Symb,MODE_MARGINREQUIRED)>AccountEquity()) {
PnC(StringConcatenate("Нехватает денег для октрытия сделки",Type," объемом: ",DoubleToStr(Lot,DG)),0);
return;
}
// проверка отложенных ордеров
/*
double Slv = MarketInfo(Symb,MODE_STOPLEVEL)*Pp;
if (Type>1) {
if (Type==2 && MarketInfo(Symb,MODE_ASK)-OP<Slv) OP=MarketInfo(Symb,MODE_ASK)-Slv;
if (Type==3 && OP-MarketInfo(Symb,MODE_BID)<Slv) OP=MarketInfo(Symb,MODE_BID)+Slv;
if (Type==4 && OP-MarketInfo(Symb,MODE_ASK)<Slv) OP=MarketInfo(Symb,MODE_ASK)+Slv;
if (Type==5 && MarketInfo(Symb,MODE_BID)-OP<Slv) OP=MarketInfo(Symb,MODE_BID)-Slv;
}
*/
RefreshRates();
int Min_Dist = MarketInfo(Symb,MODE_STOPLEVEL); //Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах. Мин. дистанция
double Tek_Ask = MarketInfo(Symb,MODE_ASK); //Последняя поступившая цена продажи. Для текущего инструмента хранится в предопределенной переменной Ask
double Tek_Bid = MarketInfo(Symb,MODE_BID); //Последняя поступившая цена предложения. Для текущего инструмента хранится в предопределенной переменной Bid
double Tek_Point = MarketInfo(Symb,MODE_POINT); //Размер пункта в валюте котировки. Для текущего инструмента хранится в предопределенной переменной Point
int Tek_Digits = MarketInfo(Symb,MODE_DIGITS);//Количество цифр после запятой в цене инструмента. Для текущего инструмента хранится в предопределенной переменной Digits
double Slv = NormalizeDouble(Min_Dist*Tek_Point,Tek_Digits);
if (Type>1) {
if (Type==2 && Tek_Ask - OP < Slv) OP = Tek_Ask - Slv;
if (Type==3 && OP - Tek_Bid < Slv) OP = Tek_Bid + Slv;
if (Type==4 && OP - Tek_Ask < Slv) OP = Tek_Ask + Slv;
if (Type==5 && Tek_Bid - OP < Slv) OP = Tek_Bid - Slv;
}
// проверка стопов
if (SL!=0 || TP!=0) {
if (Mode==0) {
if (MathAbs(OP-SL)<Slv && SL!=0) {
if (Type==0 || Type==2 || Type==4) SL=OP-Slv; else SL=OP+Slv;
}
if (MathAbs(OP-TP)<Slv && TP!=0) {
if (Type==0 || Type==2 || Type==4) TP=OP+Slv; else TP=OP-Slv;
}
}else{
if (SL*Pp<Slv && SL!=0) SL=Slv/Pp;
if (TP*Pp<Slv && TP!=0) TP=Slv/Pp;
}
}
// октрытие
for(int k=0;k<=TryToTrade;k++) {
if (Type==0) OP=MarketInfo(Symb,MODE_ASK);
if (Type==1) OP=MarketInfo(Symb,MODE_BID);
PnC(StringConcatenate("Попытка открыть ордер, тип: ",Type," объем: ",Lot," цена: ",OP),0);
if (IsTradeAllowed()) {
int Ticket=OrderSend(Symb,Type,Lot,NormalizeDouble(OP,MarketInfo(Symb,MODE_DIGITS)),3,0,0,NULL,Tek_Magic,0,CL);
}else{ PnC(StringConcatenate("Нельзя открыть ордер ",k),0); Sleep(3000); continue; }
if (Ticket >= 0) { PnC(StringConcatenate("Открыт ордер ",Ticket),0); break; }
LastError=Fun_Error(GetLastError());
if (LastError==0) {
RefreshRates(); Sleep(WaitTime);
if (k==TryToTrade) return(false); }
if (LastError==1) return(false);
if (LastError==2) { Work=false; return(false); }
}
// выставляем стопы
OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES);
if (SL==0 && TP==0) return;
if (Mode==1) {
if (SL!=0) {
if (Type==0 || Type==2 || Type==4) SL=OrderOpenPrice()-SL*Pp;
if (Type==1 || Type==3 || Type==5) SL=OrderOpenPrice()+SL*Pp;
}
if (TP!=0) {
if (Type==0 || Type==2 || Type==4) TP=OrderOpenPrice()+TP*Pp;
if (Type==1 || Type==3 || Type==5) TP=OrderOpenPrice()-TP*Pp;
}
}
for(k=0;k<=TryToTrade;k++) {
PnC(StringConcatenate("Попытка установить стопы на ордер: ",Ticket," с/л: ",SL," т/п: ",TP),0);
if (IsTradeAllowed()) {
//TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(Symb,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS)),0,CLR_NONE);
TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(SL,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS)),0,CLR_NONE);
}else{ PnC(StringConcatenate("Нельзя модифицировать ордер ",k),0); Sleep(3000); continue; }
if (TickeT == true) { PnC(StringConcatenate("Модифицирован ордер ",Ticket),0); break; }
LastError=Fun_Error(GetLastError());
if (LastError==0) {
RefreshRates(); Sleep(WaitTime);
if (k==TryToTrade) return(false); }
if (LastError==1) return(false);
if (LastError==2) { Work=false; return(false); }
}
return(true);
}
Кто-нибудь может объяснить, почему выходит ошибка 131 "неправильный объем" при модификации ордера?
Отложка нормально открывается, лот нормализуется, при выводе в принт минимальный лот 0.01, что не меньше моего объема(демо счет)
Все перечитал на форуме и не нашел, в чем проблема!!!
Прям не перестаю удивляться скрытым заморочкам, что выплывают и не описаны.Кто-нибудь может объяснить, почему выходит ошибка 131 "неправильный объем" при модификации ордера?
Отложка нормально открывается, лот нормализуется, при выводе в принт минимальный лот 0.01, что не меньше моего объема(демо счет)
Все перечитал на форуме и не нашел, в чем проблема!!!
Прям не перестаю удивляться скрытым заморочкам, что выплывают и не описаны.Попробовал на другом ДЦ вроде все нормально. Вопрос почему тогда при вызове:
выводит 0.01, а на боте принтует 131?