Ваши вопросы по языку MQL4

kamilkz

Почетный гражданин
Подскажите почему K_Lot высвечивается в Alert с 4-мя знаками?
NormalizeDouble(K_Lot,2);
Alert (K_Lot);

Что не так?
 

eevviill

Заблокирован
массивы

PHP:
Expand Collapse Copy
double WPR_al1[2];
double MA_al1[2];


WPR_al1[1]=(iWPR(Symbol(),Period(),WPR_Period,1)+50.0)*2.0;
 
ArraySetAsSeries(MA_al1,true);
MA_al1[1]=iMAOnArray(WPR_al1,0,MA_Period,0,MA_Mode,1);

Alert(MA_al1[1]);
Почему алерт выдёт 0?
 

admtw

Прохожий
ребята, помогите пожалуйста, имеется код;
PHP:
Expand Collapse Copy
void SetOrders() {
if( Close[0]==Open[0] && High[0]==Low[0] && Volume[0]<0)

double Price,ldStop=0, ldTake=0;
double pBid=Open[0]-DistanceSet*Point;

if (!ExistOrder(2)){ 
    if (StopLoss!=0) ldStop=pBid+StopLoss*Point;
    if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
  
    SetOrder(OP_SELLSTOP, pBid,  ldStop, ldTake,   2);
  }
суть в том , что ордер выставляется у меня отложенный селл стоп на расстоянии от цены открытии свечи, значение DistanceSet выставлено на "- 15", и при откате выставляется отложенный ордер на расстоянии 15 пунктов, проблема в том, что ордер выставляется слишком близко от текушей цены и успевает срабатывать, как мне реализовать так чтобы ордер срабатывал по цене открытия свечи и чтобы текущая цена была тоже на расстоянии пунктов на 20 от отложенного?( т.е должно срабатывать отложенный ордер когда цена достигнет по суте 35 пунктов от цены открытия свечи, но так чтобы было расстояние установленного ордера 15 пунктов от цены)
 

vetallic

Местный знаток
как правильно прописать сигнал чтоб при каждом тике только раз выдало если такой же уже сообщался?...
- а то пиликает постоянно :)
 

Nata_FX

Активный участник
как правильно прописать сигнал чтоб при каждом тике только раз выдало если такой же уже сообщался?...
- а то пиликает постоянно :)

Мне нравится такой способ. Пиликать на каждом баре 1 раз.

PHP:
Expand Collapse Copy
int lastTime = 0;
int start()  {
if (lastTime == 0) lastTime = Time[0];
 if (Time[0] != lastTime && Условие сигнала == true) {
    Alarm();
    lastTime = Time[0];
 }
}
 
Последнее редактирование:

vetallic

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

Nata_FX

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

vetallic

Местный знаток
ну например:

PHP:
Expand Collapse Copy
//-------------------------------------------------
if  
   MA EURUSD  100>1
{           Alert("Sell EURUSD!");           }
//-------------------------------------------------
if
   MA GBPUSD 100>1
{           Alert("Sell GBPSD!");           }
//-------------------------------------------------

оно щас у меня пиликает то одно постоянно, или все сразу - если совпали параметры... и получается в хате дискотека :)
 

Ugar

Гуру форума
ну например:

PHP:
Expand Collapse Copy
//-------------------------------------------------
if  
   MA EURUSD  100>1
{           Alert("Sell EURUSD!");           }
//-------------------------------------------------
if
   MA GBPUSD 100>1
{           Alert("Sell GBPSD!");           }
//-------------------------------------------------
оно щас у меня пиликает то одно постоянно, или все сразу - если совпали параметры... и получается в хате дискотека :)
Что бы пиликнуло один раз при получении условия и в следующий раз пиликнуло только после изменения состояния условия можно организовать триггер при помощи статическихи и локальных флагов.
bool falg=false;
static bool statflag=false;
if(условие для сигнала)flag=true;
if(statflag!=flag)Alert("текст алерта");
statflag=flag;
 

gorrec41

Новичок форума
подскажит пожайлуста а как сделать чтоб ордера не закрывались на етой же свече на которой открылись
 

Ugar

Гуру форума
подскажит пожайлуста а как сделать чтоб ордера не закрывались на етой же свече на которой открылись
Сравни время открытия текущего бара и время открытия ордера. Если время открытия ордера больше или равно времени открытия текущего бара, то запрети закрытие ордера.
 

hiks

Интересующийся
Подскажите как написать "Если есть открытый ордер, то..." и "Если нет открытого ордера , то ..."
 

Ugar

Гуру форума
Упс, малость перепутал. Всё наоборот.
if(OrdersTotal()==0)
{
//Если нет открытого ордера
}
else
{
//Если есть открытый ордер
}
Кстати, этот способ хорош своей простотой. Он вполне подходит для тестера. Но для работы мало пригоден так как нет фильтрации ордеров по маджику и символу.
 
Последнее редактирование:

hiks

Интересующийся
Сообщение от hiks
Подскажите как в коде написать:
Если последний ордер закрылся по стоплоссу то ....
Если последний ордер закрылся по тейкпрофиту то ....

Что то типа

PHP код:
OrderSelect(1,SELECT_BY_POS,MODE_HISTORY);
if(OrderTakeProfit()==OrderClosePrice()) ....
А точно так, что-то тестер игнорирует...
 

Lender

Активный участник
А точно так, что-то тестер игнорирует...

тупо сравнивать переменные с плавающей запетой не есть хорошо... , если будут различия например в 10-м знаке == уже не прокатит

Код:
Expand Collapse Copy
void MooFoo()
{
   static int last_ticket = EMPTY; 
   datetime time = 0;
   int ticket = EMPTY;
   
   for( int i = OrdersHistoryTotal()-1 ; i >= 0 ; i--) 
     if( OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) ) 
       if( OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC ) 
         if( OrderOpenTime() > time )
         {
           time = OrderOpenTime();
           ticket = OrderTicket();
         }
       
  if( ticket != EMPTY && last_ticket != ticket ) 
    if( OrderSelect(ticket, SELECT_BY_TICKET ) )
    {
      if( [COLOR="Red"]NormalizeDouble[/COLOR](OrderClosePrice(), Digits) == [COLOR="Red"]NormalizeDouble[/COLOR](OrderStopLoss(), Digits) ) // в некоотрых слочаях можна использовать if( OrderProfit() < 0.0 ) как аналог
      {
        // закрылись по стоп лосу  (или в убыток если использовали if( OrderProfit() < 0.0 ) )
      }
      
      if( [COLOR="Red"]NormalizeDouble[/COLOR](OrderClosePrice(), Digits) == [COLOR="Red"]NormalizeDouble[/COLOR](OrderTakeProfit(), Digits) ) // if( OrderProfit() > 0.0 )
      {
        // закрылись по тейку  (или в профит если использовали if( OrderProfit() > 0.0 ) )
      }
    }
              
 last_ticket = ticket;
}

код не тестировал, могут быть ошибки
 
Последнее редактирование:
  • Like
Реакции: hiks
Верх