MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 239

 
Vyacheslav Kornev :

Yardımınız için teşekkürler, ancak gerçek ticarette fiyatı nasıl alacağınız konusunda hiçbir fark yok mu? sonuçta, hem göstergeyi hem de danışmanı grafiğe atmanız gerekecek mi?

Gerçek olduğunda veri alabileceksiniz. Şans eseri gösterge çizgilerini silmezseniz ...

 
Artyom Trishkin :

Gerçek olduğunda veri alabileceksiniz. Gösterge çizgilerini yanlışlıkla kaldırmazsanız...


Tx, başka bir sorum var. harika bir danışman olduğu ortaya çıktı. Ama bunu yapmanız gerekiyor.Genellikle çizgiyi geçtiğinde bu yönde ek bir emir açılır ve ardından kârla kapatılır.Karla kapattıktan sonra Ek emrin bir daha açılmadığından nasıl emin olunur? gösterge çizgisi güncellenene kadar?

//==================Ek bir sipariş ayarlama ============
çift Lot2;
if((PriceHigh>FiyatDüşük && Ask>FiyatYüksek && LBUY<LSELL)|| (FiyatDüşük>FiyatYüksek && Ask>FiyatDüşük && LBUY<LSELL) )
 

Tünaydın! şu kodla ilgili biraz yardıma ihtiyacınız var:

11112222.txt dosyası 1 içeriyorsa SATIN AL'ı açar;

11112222.txt dosyasında -1 yazıyorsa SATIŞ açılır;

11112222.txt dosyası 0 içeriyorsa tüm siparişleri kapatır;


Yalnızca üç girişin olabileceği 11112222.txt dosyası verilmiştir: 1, -1 veya 0


nedense 11112222.txt dosyasında 0'da SATIN AL emri açılıyor ama emir kapatma kodu çalışmalı, hatanın ne olduğunu anlayamıyorum.

bu nedenle, danışman çalışırken bir sorun var, 11112222.txt dosyasını açmak neredeyse her zaman imkansız - dosyanın başka bir uygulama tarafından işgal edildiğini söylüyor, bu sorunu çözmek için her yeri dürttüm "FileClose(handle2); // bir metin dosyasını kapatma", ancak bu yardımcı olmuyor, ancak danışman 11112222.txt dosyasını açtıktan sonra içeriğini 1, -1 veya 0 için kontrol edin, ardından bu dosya periyodik olarak kullanıldığından hemen kapatın 1, -1 veya 0 yazmak için başka bir program tarafından.

//=================================BUY=========================================
    int handle2 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle2>0) // если в файле больше 0, то есть 1, то открывать BUY
   {
    
       Print(FileReadString(handle2));
       FileClose(handle2); // закрытие текстового файла

                    //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ      
                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на покупку
                     {
                        OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                        FileClose(handle2); // закрытие текстового файла
                     }
                    else
                      Print("NE USPESHNO!!!");
                      FileClose(handle2); // закрытие текстового файла

   }
//=================================конец кода BUY=========================================
      
      
      
      
      
      
      
      
//=================================SELL=========================================
    int handle3 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle3<0)//если в текстовом файле меньше 0, то есть -1, то открывать SELL
   {
    
       Print(FileReadString(handle3));
       FileClose(handle3); // закрытие текстового файла

                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на продажу
                        {
                           OrderSend(Symbol(), OP_SELL, 0.01, Bid, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                           FileClose(handle3); // закрытие текстового файла
                        }
                       else
                       Print("NE USPESHNO!!!");
                       FileClose(handle3); // закрытие текстового файла

   }
//=================================конец кода SELL=========================================
      
      
      
      
      
//=================================ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ=========================================
    int handle4 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle4=0)//если в текстовом файле равно 0, то закрыть все ордера
   {
      
       Print(FileReadString(handle4));
       FileClose(handle4); // закрытие текстового файла
//-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;

 while (OrdersTotal()>0)
 {
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {   if(OrderType()==OP_BUY)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
           OrderDelete(OrderTicket());
          
           if(result!=TRUE) { error=GetLastError();
              Print("LastError = ",error, " ",Symbol()); }
           else error=0; }
   else Print( "Error when order select ", GetLastError());
         
         FileClose(handle4); // закрытие текстового файла
  }
//------------конец кода закрывающего ордера------------------
 

         FileClose(handle4); // закрытие текстового файла
      
      
   }
//=================================конец кода ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ=========================================


 
Санек :

Tünaydın! şu kodla ilgili biraz yardıma ihtiyacınız var:

11112222.txt dosyası 1 içeriyorsa SATIN AL'ı açar;

11112222.txt dosyasında -1 yazıyorsa SATIŞ açılır;

11112222.txt dosyası 0 içeriyorsa tüm siparişleri kapatır;


Yalnızca üç girişin olabileceği 11112222.txt dosyası verilmiştir: 1, -1 veya 0


nedense 11112222.txt dosyasında 0'da SATIN AL emri açılıyor ama emir kapatma kodu çalışmalı, hatanın ne olduğunu anlayamıyorum.

bu nedenle, danışman çalışırken bir sorun var, 11112222.txt dosyasını açmak neredeyse her zaman imkansız - dosyanın başka bir uygulama tarafından işgal edildiğini söylüyor, bu sorunu çözmek için her yeri dürttüm "FileClose(handle2); // bir metin dosyasını kapatma", ancak bu yardımcı olmuyor, ancak danışman 11112222.txt dosyasını açtıktan sonra içeriğini 1, -1 veya 0 için kontrol edin, ardından başka bir program bu dosyayı kullandığından hemen kapatın 1, -1 veya 0 yazmak için her saniye.

Çünkü dosya tanıtıcısı dosyanın içeriği değildir.

İlk önce dosyanın içeriğini okumanız ve ancak daha sonra koşulu ayarlamanız gerekir. Ve tam tersi, tutamaçta bir koşul var, ardından dosyayı okuyor ve kapatıyorsunuz.

 
Alexey Viktorov :

Çünkü dosya tanıtıcısı dosyanın içeriği değildir.

İlk önce dosyanın içeriğini okumanız ve ancak daha sonra koşulu ayarlamanız gerekir. Ve tam tersi, tutamaçta bir koşul var, ardından dosyayı okuyor ve kapatıyorsunuz.

1) - Bu bölüm, 11112222.txt dosyasını buradan veri okumak için açar:

//=================================BUY=========================================
    int handle2 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения

2) - Ardından, handle2>0 ise koşul gelir


  if(handle2>0) // если в файле больше 0, то есть 1, то открывать BUY
   {

3) - İşte anlamadığım bu kısım:


       Print(FileReadString(handle2));

4) - Bu kısım dosyayı kapatır:


       FileClose(handle2); // закрытие текстового файла

5) - Handle2>0 koşulu karşılandığından, yani 11112222.txt dosyası 1 içerdiğinden, bir satın alma emri açılır:

  //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ      
                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на покупку
                     {
                        OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                        FileClose(handle2); // закрытие текстового файла
                     }
                    else
                      Print("NE USPESHNO!!!");
                      FileClose(handle2); // закрытие текстового файла

   }
//=================================конец кода BUY=========================================

Hangi kısımları karıştırdım?
 

Selamlar, siparişleri kapatmak için bir komut dosyası yazmaya çalışıyorum.

 #property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{  
   bool reasult;
   for ( int i = OrdersTotal ()- 1 ; i >= 0 ; i--)
   {
       if ( OrderSelect (i, SELECT_BY_POS )> 0 )
      {
         if ( OrderSymbol () != Symbol ())
             continue ;
         
         switch ( OrderType ())
         {
             case OP_BUY   :
               reasult = OrderClose ( OrderTicket (), OrderLots (), Bid , 50 , Red);
               if (!reasult) Print ( "Ошибка закрытия ордера на покупку", GetLastError() );
               break ;
             case OP_SELL :
               reasult = OrderClose ( OrderTicket (), OrderLots (), Ask , 50 , Blue);
               if (!reasult) Print ( "Ошибка закрытия ордера на продажу", GetLastError() );
               break ;
         }   
         
      }
   }
}

Dönüşümlü olarak birkaç sat ve al emri açarsanız ve bu emirle kapatmaya çalışırsanız, sadece birkaçı kapanır, geri kalanı 129 (Yanlış fiyat) hatası verir.

Örneğin, bir hata durumunda duraklama ile sipariş sayısı için 10 deneme * yapan bir komut dosyası oluşturmaya çalıştım.

 #property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{ 
   int c=CountTrades()* 10 ;
   
   for ( int a= 1 ; a<=c; a++)
   {
   if (CountTrades()== 0 ) { Print ( "Orders are successfully closed! Break." ); break ;}
     Print ( "Try " , a, " out of " , c);
      
       bool reasult;
       for ( int i = OrdersTotal ()- 1 ; i >= 0 ; i--)
      {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
         {
             if ( OrderSymbol () == Symbol ()) 
            
            {      
            
             if ( OrderType () == OP_BUY )  {
                  reasult = OrderClose ( OrderTicket (), OrderLots (), Bid , 50 , Red);
                   if (!reasult) { Print ( "ERROR " , GetLastError ());} 
                  }
             if ( OrderType () == OP_SELL )  {
                  reasult = OrderClose ( OrderTicket (), OrderLots (), Ask , 50 , Blue);
                   if (!reasult) { Print ( "ERROR " , GetLastError ());}  
                  }              
            }   
            
         }
      } Sleep ( 1000 );
   }   
}
//+------------------------------------------------------------------+
int CountTrades()
{
     int count= 0 ;
     for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
    {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
        {
           if ( OrderSymbol () == Symbol ())
               if ( OrderType () == OP_BUY || OrderType () == OP_SELL )
                 count++;
        }
    }
    
     return (count);
}

Kural olarak, aynı hatanın 129 verildiği oldukça fazla sayıda girişimle göreviyle başa çıkıyor. Ama o denerken, birçok denemeyle, siparişleri kapatmak için manuel olarak kapatılabilir ve bu hataya neden olmaz, kapatılır.

Neyi yanlış yapıyorum?

 
Andrey Sokolov :

Selamlar, siparişleri kapatmak için bir komut dosyası yazmaya çalışıyorum.

Dönüşümlü olarak birkaç sat ve al emri açarsanız ve bu emirle kapatmaya çalışırsanız, sadece birkaçı kapanır, geri kalanı 129 (Yanlış fiyat) hatası verir.

Örneğin, bir hata durumunda duraklama ile sipariş sayısı için 10 deneme * yapan bir komut dosyası oluşturmaya çalıştım.

Kural olarak, aynı hatanın 129 verildiği oldukça fazla sayıda girişimle göreviyle başa çıkıyor. Ama o denerken, birçok denemeyle, siparişleri kapatmak için manuel olarak kapatılabilir ve bu hataya neden olmaz, kapatılır.

Neyi yanlış yapıyorum?

             RefreshRates (); // Попробуйте добавить
             if ( OrderType () == OP_BUY )  {
                  reasult = OrderClose ( OrderTicket (), OrderLots (), Bid , 50 , Red);
                   if (!reasult) { Print ( "ERROR " , GetLastError ());} 
                  }
             if ( OrderType () == OP_SELL )  {
                  reasult = OrderClose ( OrderTicket (), OrderLots (), Ask , 50 , Blue);
                   if (!reasult) { Print ( "ERROR " , GetLastError ());}  
                  }  

Genel olarak, yazdıklarınızın gerçek bir hesapta işlem görmesine izin verilmemelidir, bu sadece test edenler içindir.

 
Vitaly Muzichenko :

Genel olarak, yazdıklarınızın gerçek bir hesapta işlem görmesine izin verilmemelidir, bu sadece test edenler içindir.

             RefreshRates (); // Попробуйте добавить

Yardımcı oldu, teşekkürler.

 
Vitaly Muzichenko :

Genel olarak, yazdıklarınızın gerçek bir hesapta işlem görmesine izin verilmemelidir, bu sadece test edenler içindir.


Neden "ticarete izin verilemiyor .." açıklayabilir misiniz?

 
Andrey Sokolov :

Neden "ticarete izin verilemiyor .." açıklayabilir misiniz?

Hata denetimi yoktur ve aniden bir kapanma olursa ve sunucu kritik bir hata verirse, danışman sunucuyu zorlamaya devam eder ve bu, sonraki otomatik ticaret için DC'den bir yasak gibi kokar.