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

 
forexman77:

Попробовал на другом ДЦ вроде все нормально. Вопрос почему тогда при вызове:

выводит 0.01, а на боте принтует 131?

Лоты нужно нормализовать при передаче в функцию.

 
Artyom Trishkin:

Лоты нужно нормализовать при передаче в функцию.


Вообще-то написал, что нормализацию провожу. Там какое-то ограничение в кол-во лотов при авто торговле.

Не надо тут включать "капитана очевидность".
 
forexman77:

Вообще-то написал, что нормализацию провожу. Там какое-то ограничение в кол-во лотов при авто торговле.

Не надо тут включать "капитана очевидность".

Ну сами ищите коль так решили общаться.

 
rabanik:

Спасибо, большое за ответ.

Вот вся функция, смысл в том, что она открывает ордер, а затем через модификацию добавляет постоянные значения стоп лосс и тейк профит.

Так вот, ордер открывается а стоп лосс и текй профит не проставляются (функцию расчета выделил красным, вот в ней то и 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. ППц какой то!!!
 
rabanik:
Теперь следующая ошибка по строке if (Type==0 || Type==2 || Type==4) SL=OrderOpenPrice()-SL*Pp;. Функция OrderOpenPrice() возвращает туже ошибку - Expression could not be evaluated. ППц какой то!!!

Все разобрался. Извините за глупый вопрос. У меня гл. переменная SL тип int.

А я пытаюсь опять же получить значение SL с типом double. Но система возвращает мне 1.

Спасибо.

 

Может кто подскажет,как сделать в советнике так,чтобы работа советника из определённого места вернулась в своё начало, не продолжая выполнять дальнейшие операторы. 

 

Здравствуйте. Вопрос следующий, советник не открывает сделку на продажу. Можете посмотреть?

 if (Digits==3||Digits==5) {sl=SL*10*Point;}
         else if (Digits==4||Digits==2) {sl=SL*Point;}
            if (OrdersTotal()==0)
              {
                if (Close[1]>TD2)
                OrderSend (Symbol(),OP_BUY,Lot,Ask,10,Ask-sl,0,NULL,Magic,0,clrBlue);
                else if (Close[1]<TD1)
                OrderSend (Symbol(),OP_SELL,Lot,Bid,10,Bid+sl,0,NULL,Magic,0,clrRed);
              }
 
6737998:

Может кто подскажет,как сделать в советнике так,чтобы работа советника из определённого места вернулась в своё начало, не продолжая выполнять дальнейшие операторы. 

Оператор возврата return - Операторы - Основы языка - Справочник MQL4
Оператор возврата return - Операторы - Основы языка - Справочник MQL4
  • docs.mql4.com
Оператор возврата return - Операторы - Основы языка - Справочник MQL4
 
danil77783:

Здравствуйте. Вопрос следующий, советник не открывает сделку на продажу. Можете посмотреть?

Что такое TD1 и где ему присваивается значение?
 

Друзья, как правильно выйти из такой ситуации... Индикатор отрисовывает из CSV две горизонтальные линии(Красная - с начала дня до конца дня) Синяя - Луч идущий из прошлых дней, на разных ценовых уровнях. Но бывают дни когда у этих уровней одинаковые значения/цена. Как правильно выйти из ситуации, чтобы при совпадении линий Луч(Синий) отображался, а Красная линия была не видна на графике, но физически присутствовала...т.е. была прозрачной.

Сейчас - Draw_Level("Red", red, DRAW_NONE, STYLE_SOLID,0); перестает отрисовывать линию, но и Луч из-под нее не виден. Спасибо.

Причина обращения: