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

 

@STARİJ Teşekkürler, ObjectSet'i yazmaya zaman ayırdım! Bu uzun zamandır yazılıyor, yorum yapmadım ve koda müdahale etmiyor! yani unutmamak için! StringSubstr (str,20,7) yazdınız, tamamen gerçek olduğunu düşünmedim! Akşam yemeğinden sonra, boşluklarda olduğunu anladım! Her karakteri ve boşluğu saymak gerekiyordu! Teşekkürler arkadaşım!!!!


 

Merhaba canım. mkl4'te başka bir acemi sorusu. Yeni bir çubuk tanımlamak için öğretici tarafından önerilen Fun_New_Bar() özel işlevini kullanıyorum:


 void Fun_New_Bar()                               // Ф-ия обнаружения нового бара   
  {                                             
   static datetime New_Time= 0 ;                   // Время текущего бара  
   New_Bar= false ;                               // Нового бара нет  
   if (New_Time!= Time [ 0 ])                         // Сравниваем время  
     {  
      New_Time= Time [ 0 ];                         // Теперь время такое  
      New_Bar= true ;                             // Поймался новый бар  
     }  
  }
Ancak, bazı nedenlerden dolayı her zaman işe yaramaz. Eklenen baskı kontrolü:
 if ( Hour ()>= 8 && Hour ()< 20 ) 
      {
      Fun_New_Bar();
       if (New_Bar== false ) Print ( "Нового бара нет" );
       if (New_Bar== true )      
       {     
       RefreshRates ();
        ........... Fun_Open_Sell();          
        ........... Fun_Open_Buy();
       } 
      }

Yani ya pozisyonlar yeni bir çubukta açılır ya da "Yeni çubuk yok" yazdırır ve mevcut çubukta bir pozisyon açar. Nedenini anlayamıyorum. Teşekkür ederim.

 
novichok2018 :

Merhaba canım. mkl4'te başka bir acemi sorusu. Yeni bir çubuk tanımlamak için öğretici tarafından önerilen Fun_New_Bar() özel işlevini kullanıyorum:

Ancak, bazı nedenlerden dolayı her zaman işe yaramaz. Eklenen baskı kontrolü:

Yani ya pozisyonlar yeni bir çubukta açılır ya da "Yeni çubuk yok" yazdırır ve mevcut çubukta bir pozisyon açar. Nedenini anlayamıyorum. Teşekkür ederim.

yeni bir çubuk ile mevcut bir çubuk arasında nasıl ayrım yaparsınız? Kodun verilen kısmı ne sıklıkla yürütülür - her onay işareti mi yoksa yalnızca yeni bir çubuğun oluşumu anında mı?

 
STARIJ :

yeni bir çubuk ile mevcut bir çubuk arasında nasıl ayrım yaparsınız? Kodun verilen kısmı ne sıklıkla yürütülür - her onay işareti mi yoksa yalnızca yeni bir çubuğun oluşumu anında mı?

Yeni çubuk - işleve göre. Mevcut - pozisyonun kapatıldığı , ancak çubuğun süresinin dolmadığı. Kod, yeni bir çubuğun oluşumu sırasında yürütülmelidir. Daha doğrusu öyle değil. Kodun, bir pozisyonu kapatma koşullarının tanımlandığı kısmı - her onay işareti ve açılış için - yeni bir çubukta yürütülür.

 
novichok2018 :

Yeni çubuk - işleve göre. Mevcut - pozisyonun kapatıldığı , ancak çubuğun süresinin dolmadığı. Yeni bir çubuk oluşturulduğunda kod yürütülmelidir. Daha doğrusu öyle değil. Kodun bir pozisyonu kapatma koşullarının tanımlandığı kısmı, her onay işareti ve açılış için - yeni bir çubukta yürütülür.

Kısacası, burada her şey açık. Ancak yazdığınızda ve daha kesin yazmanız gerektiğini gördüğünüzde, imleci geri döndürün ve düzeltin. Ve okuması zor - bir şekilde, sonra başka bir şekilde.

Kod her işarette yürütülür. Onlar. soru her zaman sorulur Yeni bir bar var mı? Yeni bir bar var mı? Yeni bir bar var mı? ve her seferinde yeni bir çubuğun bulunmadığına dair bir mesaj yazdırılır. Ve işte yeni bir bar . Sipariş açık mı? iyi bekle. İlk olarak sunucuya bir komut gönderilir. Tikler gelene ve yeni bir bar olana kadar mı? Yeni bir bar var mı? ve her seferinde yeni bir çubuğun yokluğuyla ilgili bir mesaj yazdırılır ve son olarak, sunucu bir sipariş açar - saate bakarsınız ve şaşırırsınız. Ve bir siparişi açmadan önce Print( TimeCurrent() ) öğesini ilkinin 4 satır altına eklersiniz. Ve Uyarıyı kullanmak daha iyidir - hemen ekranda. hemen görebilirsiniz...

Ve bir şey daha: if(New_Bar==false) if(New_Bar==true) yerine if(!New_Bar) if(New_Bar) kullanabilirsiniz, aksi takdirde tereyağı alırsınız

 
STARIJ :

Kısacası, burada her şey açık. Ancak yazdığınızda ve daha kesin yazmanız gerektiğini gördüğünüzde, imleci geri döndürün ve düzeltin. Ve okuması zor - bir şekilde, sonra başka bir şekilde.

Kod her işarette yürütülür. Onlar. soru her zaman sorulur Yeni bir bar var mı? Yeni bir bar var mı? Yeni bir bar var mı? ve her seferinde yeni bir çubuğun bulunmadığına dair bir mesaj yazdırılır. Ve işte yeni bir bar . Sipariş açık mı? iyi bekle. İlk olarak sunucuya bir komut gönderilir. Tikler gelene ve yeni bir bar olana kadar mı? Yeni bir bar var mı? ve her seferinde yeni bir çubuğun yokluğuyla ilgili bir mesaj yazdırılır ve son olarak, sunucu bir sipariş açar - saate bakarsınız ve şaşırırsınız. Ve bir siparişi açmadan önce Print(TimeCurrent()) öğesini ilkinin 4 satır altına eklersiniz. Ve Uyarıyı kullanmak daha iyidir - hemen ekranda. hemen görebilirsiniz...

Ve bir şey daha: if(New_Bar==false) if(New_Bar==true) yerine if(!New_Bar) if(New_Bar) kullanabilirsiniz, aksi takdirde tereyağı alırsınız

Eh, yeni bir çubuğun yokluğuyla ilgili mesajla her şey açık. Platform tarafından dergide basılan sipariş açılış süresi, ek bir baskı olmadan bile benim için yeterli. Bir emrin neden bir kez yeni bir çubukta ve diğerinde mevcut olanda açıldığı hala belirsizliğini koruyor, ancak koda göre, bir pozisyon açmak için koşullar aranmadan önce yeni bir çubuk görünmesi gerekiyor.

 
novichok2018 :

Eh, yeni bir çubuğun yokluğuyla ilgili mesajla her şey açık. Platform tarafından dergide basılan sipariş açılış süresi, ek bir baskı olmadan bile benim için yeterli. Bir emrin neden bir kez yeni bir çubukta ve diğerinde mevcut olanda açıldığı hala belirsizliğini koruyor, ancak koda göre, bir pozisyon açmak için koşullar aranmadan önce yeni bir çubuk görünmesi gerekiyor.

İlk olarak sunucuya bir komut gönderilir. Tikler gelene ve yeni bir bar olana kadar mı? Yeni bir bar var mı? ve her seferinde yeni bir çubuğun yokluğuyla ilgili bir mesaj yazdırılır ve son olarak, sunucu bir sipariş açar - saate bakarsınız ve şaşırırsınız. Ve bir siparişi açmadan önce Print( TimeCurrent() ) öğesini ilkinin 4 satır altına eklersiniz. Ve Uyarıyı kullanmak daha iyidir - hemen ekranda. Bir sipariş açma komutunun daha önce yeni bir çubukta gönderildiğini hemen görebilirsiniz.

 

Söylesene, 2 gösterge çizgisi arasında bir renk dolgusu olacak şekilde nasıl mümkün olabilir?

ichimoku gibi

 
Roman Sharanov :

Söyleyin bana, 2 gösterge çizgisi arasında bir renk dolgusu olacak şekilde nasıl mümkün olabilir? ichimoku gibi

Nasıl yapıldığını görün ... Ve terminal muhtemelen...

 

Merhaba, 2013 yılından itibaren video eğitimlerini kullanarak MQL4 öğrenmeye başladım, videodaki kodu aynen yeniden yazıyorum, ihtiyacım olan başka bir videodan küçük değişiklikler ekliyorum, sonuç olarak 25 hata alıyorum. Bu hatalara bir çözüm aramaya çalıştım ama anladığım kadarıyla terminal yapısı değişti ve bunun sonucunda kod yazımında bazı değişiklikler oldu. Birisi kodu düzenlemeye yardımcı olursa veya en azından iyi bir tavsiyede bulunursa minnettar olurum, şimdiden teşekkürler.

 //+------------------------------------------------------------------+
//|                                                           ea.mq4 |
//|                                                             mql4 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Intruder"
#property link        ""
#property version    "1.00"
#property strict

extern double Lots         = 0.1 ;
extern int     TakeProfit   = 50 ;
extern int     Step         = 50 ;
extern double Multiplier   = 2 ;
extern int     Slippage     = 5 ;
extern int     Magic        = 123 ;

extern int     MA_1_Period  = 21 ;
extern int     MA_1_Shift   = 0 ;

extern int     MA_2_Period  = 3 ;
extern int     MA_2_Shift   = 0 ;


int ticket;
double price, TP, lastlot;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int Init()
{
   if ( Digits == 3 || Digits == 5 )
   {
       TakeProfit *= 10 ;
       Step       *= 10 ;
       Slippage   *= 10 ;  
   }
   return ( 0 );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert start function                                             |
//+------------------------------------------------------------------+
int start()
{
   if (CountTrades() == 0 )
   {
       double ima_1 = iMA ( Symbol (), PERIOD_CURRENT , MA_1_Period, MA_1_Shift, MODE_SMA , PRICE_CLOSE , 1 );
       double ima_2 = iMA ( Symbol (), PERIOD_CURRENT , MA_2_Period, MA_2_Shift, MODE_SMA , PRICE_CLOSE , 1 );
      
       if (ima_1 > ima_2)
      {
         ticket = OrderSend ( Symbol (), OP_BUY , Lots, Ask , Slippage, 0 , 0 , "" , Magic, 0 , Blue);
         if (ticket > 0 )
         {
            TP = NormalizeDouble ( Ask + TakeProfit * Point , Digits );
             OrderModify (ticket, OrderOpenPrice (), 0 , TP, 0 );
         }
      }
       else if (ima_1 < ima_2)
      {
         ticket = OrderSend ( Symbol (), OP_SELL , Lots, Bid , Slippage, 0 , 0 , "" , Magic, 0 , Red);
         if (ticket > 0 )
         {
            TP = NormalizeDouble ( Bid - TakeProfit * Point , Digits );
             OrderModify (ticket, OrderOpenPrice (), 0 , TP, 0 );
         }
      }
      
   }
   else
   {
       int order_type = FindLastType();
       if (order_type == OP_BUY )
      {
         price = FindLastOrderPrice( OP_BUY );
         if ( Ask <= price - Step * Point )
         {
            Lastlot = FindLastLots ( OP_BUY );
            lastlot = NormalizeDouble (lastlot * Multiplier, 2 );
            ticket = OrderSend ( Symbol (), OP_BUY , lastlot, Ask , Slippage, 0 , 0 , "" , Magic, 0 , Blue);
             if (ticket > 0 )
               ModifiOrders( OP_BUY );
         }
      }
       else if (order_type == OP_SELL )
      {
          price = FindLastOrderPrice( OP_SELL );
         if ( Bid <= price + Step * Point )
         {
            Lastlot = FindLastLots ( OP_SELL );
            lastlot = NormalizeDouble (lastlot * Multiplier, 2 );
            ticket = OrderSend ( Symbol (), OP_BUY , lastlot, Bid , Slippage, 0 , 0 , "" , Magic, 0 , Red);
             if (ticket > 0 )
               ModifiOrders( OP_SELL );
         }        
      }
   }
   
   return ( 0 );
}
//+------------------------------------------------------------------+
void ModifiOrders( int otype)
{
   double avgprice = 0 ,
          order_lots= 0 ;
   
   price = 0 ;
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
       if (OrderSelecti(i, SELECT_BY_POS , MODE_TRADES ))
      {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic && OrderType () == otype)
         {
            price += OrderOpenPrice () * OrderLots ();
            order_lots += OrderLots ();
         }
      }
   }
   avgprice = NormalizeDouble (price / order_lots, Digits );
   
   if (otype == OP_BUY ) TP = NormalizeDouble (avgprice + TakeProfit* Point , Digits );
   if (otype == OP_SELL ) TP = NormalizeDouble (avgprice - TakeProfit* Point , Digits );
   
   for (i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
       if ( OrderSelect (i SELECT_BY_POS , MODE_TRADES ))
      {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic && OrderType () == otype)
             OrderModify ( OrderTicket (), OrderOpenPrice (), 0 , TP, 0 )    
      } 
   }
}
//+------------------------------------------------------------------+
double FindLastLots( int otype)
{
   double oldlots;
   int oldticket;
   
   ticket = 0 ;
   for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
      {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic && OrderType () ++ otype)
         {
            oldticket = OrderTicket ();
             if (oldticket > ticket)
            {
               oldlots = OrderLots ();
               ticket = oldticket;
            }
         }
      }
   }
   return (oldlots);
}
//+------------------------------------------------------------------+
double FindLastOrderPrice( int otype)
{
   double oldopenprice;
   int     oldticket;
   
   ticket = 0 ;
   
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
      {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic && OrderType () == otype
         {
            oldticket = OrderTicket ();
             if (oldticket > ticket)
            {
               oldopenprice = OrderOpenPrice ();
               ticket = oldticket;
            }
         }
      }
   }
   return (oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
      {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic)
               return ( OrderType ());
      }
   }
   return (- 1 );   
}
//+------------------------------------------------------------------+
int CountTrades()
{
   int count = 0 ;
   for ( int i= OrdersTotal ()- 1 i>= 0 ; i--)
   {
         if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
        {
             if ( OrderSymbol () == Symbol () && OrderMagicNumber () == Magic)
               count++;
        }
   }
   
   return (count);

//-------------------------------------------------------------------+

hatalar