Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 305

 
PokrovMT5 :

Herkese iyi akşamlar! Test cihazında açık anlaşmalar hakkında bir iz bırakmayı düşündüm, OrderGet....() üzerinden gitmeye çalıştım ve anlaşmanın siparişler kategorisinden açık bir pozisyona geçtiğini fark ettim, bu yüzden PositionGet'e geçtim.... (), ama yine hiçbir şey işe yaramadı,

yani soru şu ki, şimdi HistoryDealGet...() üzerinden ne yapmalıyım? Yoksa bir şey anlamıyor muyum? Test cihazında açık bir ticarette SL'yi değiştirmek için hangi yol izlenir? Yorumlar için şimdiden teşekkürler.

 PositionSelect ( Symbol ())
 

Lütfen burnumu dürt !!!! MQL5'te bir grafikteki bir grafik nesnenin mevcudiyeti (veya yokluğu) için bir kontrol, örneğin bir trend çizgisi veya dikey olan nasıl uygulanır?

İdeal olarak, "Sipariş Olmazsa" veya "Sipariş Varsa" gibi bir mantık yapmak istiyorum.

 
aleks557 :

Lütfen burnumu dürt !!!! MQL5'te bir grafikteki bir grafik nesnenin mevcudiyeti (veya yokluğu) için bir kontrol, örneğin bir trend çizgisi veya dikey olan nasıl uygulanır?

İdeal olarak, "Sipariş Olmazsa" veya "Sipariş Varsa" gibi bir mantık yapmak istiyorum.

https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
pako :
Teşekkür ederim! Her şey çalışıyor))).
 

Satın alma algoritmasını doğru bir şekilde nasıl uygulayacağımı söyle?

Şimdi danışman, sinyal geldiğinde, açık pozisyonlar olduğu bilgisi gelene kadar birçok kez satın alıyor, ancak geç oldu. Danışman, ilk satın alma işleminden sonra (koşullar oluştuğunda) borsanın yanıtını nasıl bekletir?

Şimdi sorun şu ki, Bye_opened değişkeni doğru olmalı ve bu, EA'nın stoplar isabet edene kadar fazladan işlem yapmasını engellemeli. Ama değişken değişiklikler Bye_opened olur uzun bir süre ve danışman birkaç kez anlaşma yapmayı başarır .


Kodumda ne eksik? Lütfen kusuru belirtin.


 //--- Do we have positions opened already?
   bool Buy_opened= false ;   // variable to hold the result of Buy opened position
   bool Sell_opened= false ; // variables to hold the result of Sell opened position

   if ( PositionSelect ( _Symbol )== true ) // we have an opened position
     {
       if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
        {
         Buy_opened= true ;   //It is a Buy
        }
       else if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
        {
         Sell_opened= true ; // It is a Sell
        }
     }

//+------------------------------------------------------------------+
//|   СОВЕРШАЕМ СДЕЛКУ                                               |
//+------------------------------------------------------------------+
                  
     if (last_tick.last < BBLow[ 2 ] && Buy_opened == false )
        {
         int znak = last_tick.last - BBLow[ 2 ];

       //--- 1. Создать запрос
         
         MqlTradeRequest Trade_reqst={ 0 };             // Инициализация структуры торгового запроса
         Trade_reqst.action= TRADE_ACTION_DEAL ;       // Тип: немедленное совершение сделки
         Trade_reqst.symbol= _Symbol ;                 // Инструмент: текущий
         Trade_reqst.volume=Lot;                     // Объём: 1 лот
         Trade_reqst.price= SymbolInfoDouble ( _Symbol , SYMBOL_ASK )-TakeProfit* _Point ; // Цена исполнения
         Trade_reqst.type= ORDER_TYPE_BUY ;             // Тип ордера: на продажу
         Trade_reqst.type_filling= ORDER_FILLING_RETURN ; // Политика исполнения 
         Trade_reqst.sl=last_tick.last - StopLoss * _Point ;   // Stop Loss
         Trade_reqst.tp= SymbolInfoDouble ( _Symbol , SYMBOL_ASK ) + TakeProfit * _Point ; // Take Profit
       // Trade_reqst.tp=Trade_reqst.price + TakeProfit * 2 * _Point; // Take Profit
       //--- 2. Отправить торговый приказ
         MqlTradeResult Trade_reslt={ 0 };             // Инициализация структуры результата торгового запроса
         OrderSend (Trade_reqst,Trade_reslt);         // Отправка торгового запроса на сервер
   //--- выведем в лог ответ сервера  
   //Print(__FUNCTION__," - : - ",Trade_reslt.comment);
   if (Trade_reslt.retcode== 10016 ) Print ( "Ответ: " ,Trade_reslt.bid,Trade_reslt.ask,Trade_reslt.price);
 
mavar :

Şimdi sorun şu ki, Bye_opened değişkeni doğru olmalı ve bu, EA'nın stoplara ulaşana kadar fazladan işlem yapmasını engellemeli. Ama değişken değişiklikler Bye_opened olur uzun bir süre ve danışman birkaç kez anlaşma yapmayı başarır .

Değişkenin değişmesinin uzun sürmesi... Bunu nasıl belirlediniz? Tamam, öyle olduğunu farz edelim. O zaman cevap sorunun içinde. Bir pozisyonu açmak için bir gecikmeye ihtiyacınız var, bu yüzden N'nin deneysel olarak kendiniz hesaplandığı yerde Sleep(N) koyun.

Seçenek numarası 2. Cevap yine sorunun içinde. Bye_opened'ı global yapın ve bir pozisyonun başarılı bir şekilde açılmasından hemen sonra aynı modülde değiştirin. Bir pozisyonun varlığını kontrol ettiğiniz gibi sıfırlayın.  

 
papaklass :
...

satırı eklerseniz

OrderSend() komutundan sonra, pozisyonların yeniden açılması olmayacaktır.

Belki önce açılıp açılmadığını kontrol etmek daha iyidir ve ancak o zaman...

???

 
papaklass :

Görünüşe göre robotu her kene üzerinde çalışıyor. Siparişin sunucuya gönderilmesi ile sunucudan yanıt alınması arasında birkaç tik daha gelecek ve her birinde fazladan bir pozisyon açılacaktır. Önerim yeniden keşif durumunu hariç tutuyor. Ve bir pozisyonun açılıp açılmadığını kontrol etmek gerekir.

Yani aynı şeyden bahsediyorum. Aksi takdirde, kelimenin tam anlamıyla her şeyi anlayacak ve önemli bir kontrolü kaçıracaktır.
 
artmedia70 :
Yani aynı şeyden bahsediyorum. Aksi takdirde, kelimenin tam anlamıyla her şeyi anlayacak ve önemli bir kontrolü kaçıracaktır.

Peki kontrol etmenin doğru yolu nedir? Üzgünüm, üstesinden gelemem.

İşte kod (her şey OnTick bloğunda bulunur):


 void OnTick ()
  {

       MqlTick last_tick;
     
       if ( SymbolInfoTick ( Symbol (),last_tick))
        {
         // Print(last_tick.time,": Bid = ",last_tick.bid,
         //       " Ask = ",last_tick.ask,"  Volume = ",last_tick.volume, "  LastPrice = ",last_tick.last );
        }
       else Print ( "SymbolInfoTick() failed, error = " , GetLastError ());
       //---
      
         //---Читаем свечку
   MqlRates rates[];
   ArraySetAsSeries (rates, true );
   int copied= CopyRates ( Symbol (), 0 , 0 , 1 ,rates);
   if (copied> 0 )
     {
       //Print("Скопировано баров: "+copied);
       string format= "open = %G, high = %G, low = %G, close = %G, volume = %d" ;
       string out;
       int size= fmin (copied, 10 );
       for ( int i= 0 ;i<size;i++)
        {
         //out=i+":"+TimeToString(rates[i].time);
         out=out+ " " + StringFormat (format,
                                  rates[i].open,
                                  rates[i].high,
                                  rates[i].low,
                                  rates[i].close,
                                  rates[i].tick_volume);
         // Print(out);
       
         //Print(rates[i].open - rates[i].close );

        }
     }
   else Print ( "Не удалось получить исторические данные по символу " , Symbol ());

//---=======-----\_____BOLLINGER____/--------========--//
//--- получить хэндл индикатора Bollinger Bands и DEMA
      BolBandsHandle= iBands ( NULL ,my_timeframe,bands_period,bands_shift,deviation, PRICE_LOW );
       ChartIndicatorAdd ( 0 , 0 ,BolBandsHandle);
   
//--- копируем новые значения индикаторов используя хэндлы
   if ( CopyBuffer (BolBandsHandle, 0 , 0 , 3 ,BBMidle)< 0 || CopyBuffer (BolBandsHandle, 1 , 0 , 3 ,BBUp)< 0
      || CopyBuffer (BolBandsHandle, 2 , 0 , 3 ,BBLow)< 0 )
     {
       Alert ( "Ошибка копирования буферов индикатора Bollinger Bands - номер ошибки:" , GetLastError (), "!!" );
       return ;
     }
//********** это цикл надо добавить в код советника, выводит значения при наступлении нового бара
   //for(int nbar=0; nbar < 3; nbar++)
     // Print("nbar=", nbar, "  BBLow[nbar]=", DoubleToString(BBLow[nbar], _Digits), "  BBMidle[nbar]", DoubleToString(BBMidle[nbar], _Digits),
   //                 "  BBUp[nbar]=", DoubleToString(BBUp[nbar], _Digits));
      
      
   //--- Define some MQL5 Structures we will use for our trade
   MqlTick latest_price;       // To be used for getting recent/latest price quotes
   
       
   //--- Do we have positions opened already?
   bool Buy_opened= false ;   // variable to hold the result of Buy opened position
   bool Sell_opened= false ; // variables to hold the result of Sell opened position

   if ( PositionSelect ( _Symbol )== true ) // we have an opened position
     {
       if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
        {
         Buy_opened= true ;   //It is a Buy
        }
       else if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
        {
         Sell_opened= true ; // It is a Sell
        }
     }

//+------------------------------------------------------------------+
//|   СОВЕРШАЕМ СДЕЛКУ                                               |
//+------------------------------------------------------------------+
                  
     if (last_tick.last < BBLow[ 2 ]-natyajka && Buy_opened == false )
        {
         int znak = last_tick.last - BBLow[ 2 ];

       //--- 1. Создать запрос
         
         MqlTradeRequest Trade_reqst={ 0 };             // Инициализация структуры торгового запроса
         Trade_reqst.action= TRADE_ACTION_DEAL ;       // Тип: немедленное совершение сделки
         Trade_reqst.symbol= _Symbol ;                 // Инструмент: текущий
         Trade_reqst.volume=Lot;                     // Объём: 1 лот
         Trade_reqst.price= SymbolInfoDouble ( _Symbol , SYMBOL_ASK )-TakeProfit* _Point ; // Цена исполнения
         Trade_reqst.type= ORDER_TYPE_BUY ;             // Тип ордера: на продажу
         Trade_reqst.type_filling= ORDER_FILLING_RETURN ; // Политика исполнения 
         Trade_reqst.sl=last_tick.last - StopLoss * _Point ;   // Stop Loss
         Trade_reqst.tp= SymbolInfoDouble ( _Symbol , SYMBOL_ASK ) + TakeProfit * _Point ; // Take Profit
       // Trade_reqst.tp=Trade_reqst.price + TakeProfit * 2 * _Point; // Take Profit
       //--- 2. Отправить торговый приказ
         MqlTradeResult Trade_reslt={ 0 };             // Инициализация структуры результата торгового запроса
         OrderSend (Trade_reqst,Trade_reslt);         // Отправка торгового запроса на сервер
   //--- выведем в лог ответ сервера  
   //Print(__FUNCTION__," - : - ",Trade_reslt.comment);
   if (Trade_reslt.retcode== 10016 ) Print ( "Ответ: " ,Trade_reslt.bid,Trade_reslt.ask,Trade_reslt.price);

//--- вернем код ответа торгового сервера
         Print ( "Покупаю. Buy_opened = " , Buy_opened);
         Print ( "last_tick.last= " , last_tick.last, 
               " last_tick.ask= " , last_tick.ask, " - " ,    
               " BBLow= " , DoubleToString (BBLow[ 2 ], _Digits ) , 
               " SYMBOL_BID=" , SymbolInfoDouble ( _Symbol , SYMBOL_BID ),
               " SYMBOL_ASK=" , SymbolInfoDouble ( _Symbol , SYMBOL_ASK ), 
               " StopLoss=" , StopLoss,
               " TakeProfit=" , TakeProfit,
               " Trade_reslt.bid=" , Trade_reslt.bid,
               " Trade_reslt.bid=" , Trade_reslt.bid,
               " Trade_reslt.ask=" , Trade_reslt.ask
            ); 

      
   //return Trade_reslt.retcode;

         
        }

  } 
 
papaklass :

Ekstra ciltleri açmamak için:

Ne yazık ki, bir ticaret açarken bu koşul çalışmaz.

       //проверка выполнения торгового приказа
       if (Trade_reslt.retcode== 10009 )   //заявка выполнена
      {
         Bye_opened = true ;
      }