Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 307
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Попробовал на другом ДЦ вроде все нормально. Вопрос почему тогда при вызове:
выводит 0.01, а на боте принтует 131?
Лоты нужно нормализовать при передаче в функцию.
Лоты нужно нормализовать при передаче в функцию.
Вообще-то написал, что нормализацию провожу. Там какое-то ограничение в кол-во лотов при авто торговле.
Не надо тут включать "капитана очевидность".Вообще-то написал, что нормализацию провожу. Там какое-то ограничение в кол-во лотов при авто торговле.
Не надо тут включать "капитана очевидность".Ну сами ищите коль так решили общаться.
Спасибо, большое за ответ.
Вот вся функция, смысл в том, что она открывает ордер, а затем через модификацию добавляет постоянные значения стоп лосс и тейк профит.
Так вот, ордер открывается а стоп лосс и текй профит не проставляются (функцию расчета выделил красным, вот в ней то и 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);
}
Теперь следующая ошибка по строке if (Type==0 || Type==2 || Type==4) SL=OrderOpenPrice()-SL*Pp;. Функция OrderOpenPrice() возвращает туже ошибку - Expression could not be evaluated. ППц какой то!!!
Все разобрался. Извините за глупый вопрос. У меня гл. переменная SL тип int.
А я пытаюсь опять же получить значение SL с типом double. Но система возвращает мне 1.
Спасибо.
Может кто подскажет,как сделать в советнике так,чтобы работа советника из определённого места вернулась в своё начало, не продолжая выполнять дальнейшие операторы.
Здравствуйте. Вопрос следующий, советник не открывает сделку на продажу. Можете посмотреть?
Может кто подскажет,как сделать в советнике так,чтобы работа советника из определённого места вернулась в своё начало, не продолжая выполнять дальнейшие операторы.
Здравствуйте. Вопрос следующий, советник не открывает сделку на продажу. Можете посмотреть?
Друзья, как правильно выйти из такой ситуации... Индикатор отрисовывает из CSV две горизонтальные линии(Красная - с начала дня до конца дня) Синяя - Луч идущий из прошлых дней, на разных ценовых уровнях. Но бывают дни когда у этих уровней одинаковые значения/цена. Как правильно выйти из ситуации, чтобы при совпадении линий Луч(Синий) отображался, а Красная линия была не видна на графике, но физически присутствовала...т.е. была прозрачной.
Сейчас - Draw_Level("Red", red, DRAW_NONE, STYLE_SOLID,0); перестает отрисовывать линию, но и Луч из-под нее не виден. Спасибо.