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

 

Tünaydın.

Lütfen bana MT4'te bir danışmanla işlem yaparken kodu nasıl doğru yazacağımı söyleyin, ben kendim programlamada çok yeniyim.

Son kapatılan emri seçmem ve duruma göre karı karşılaştırmam gerekiyor, emrin karı 0'dan büyükse, o zaman yapacak bir şey yok, 0'dan küçükse, o zaman bir şey yap.

 double GetSizeLot( double lastlot= 0 ) //Функция возвращает значение лотов 
  {
   double Lot2,MinLots,MaxLots;
   int j=OrdersHistoryTotal();
   
   MinLots=Lots;
   MaxLots=MaxLot;
   if (!DynamicLot)Lot2=Lots;
   if (lastlot<Lot2)lastlot=Lot2;
   
   if ( OrderSelect (j,SELECT_BY_POS,MODE_HISTORY))
     {
     if (OrderProfit()< 0 ) lastlot=lastlot*Martin;
     if (OrderProfit()> 0 ) lastlot=Lot2;
     }
   Lot2=lastlot;
   if (Lot2 < MinLots) Lot2 = MinLots;
   if (Lot2 > MaxLots) Lot2 = MaxLots;
   return ( NormalizeDouble (Lot2, 2 ));
  }

Saygılarımla, İskender.

 
Menshikov :

Tünaydın.

Lütfen bana MT4'te bir danışmanla işlem yaparken kodu nasıl doğru yazacağımı söyleyin, ben kendim programlamada çok yeniyim.

Son kapatılan emri seçmem ve duruma göre karı karşılaştırmam gerekiyor, emrin karı 0'dan büyükse, o zaman yapacak bir şey yok, 0'dan küçükse, o zaman bir şey yap.

Saygılarımla, İskender.

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

datetime time= 0 ; double profit= 0 ,lots= 0 ;
for ( int i=OrdersHistoryTotal()- 1 ; i>= 0 ; i--)
   if ( OrderSelect (i,SELECT_BY_POS,MODE_HISTORY))
       if (OrderSymbol()== _Symbol )
         if (OrderMagicNumber()==MagicNumber || MagicNumber==- 1 )
             if (OrderCloseTime()>time) // находим последний в истории ордер
              {
               time=OrderCloseTime(); // запомним время
               profit=OrderProfit();   // запомним профит
               his_lt=OrderLots();     // запомним лот
              }

if (profit< 0 ) //если профит меньше нуля
   lots=his_lt* 2 ; // Увеличим в два раза

//+------------------------------------------------------------------+
 
Vladimir Pastushak :
Çok teşekkürler.
 
Vladimir Pastushak :
İlginçtir ki, zaman ne için, neden listedeki sonuncuyu ve hatta bir döngüyü seçtiyseniz, kapanış saatini neden hatırlıyorsunuz? Ve neden takas ve komisyonu dikkate almıyorsunuz? OrderProfit()>0 olsa bile gerçek karı negatif olabilir. Doğrudan sipariş listesiyle çalışıyorsanız, son kapanış saati için arama döngüsünün kodundan parça bırakmanıza bile gerek yoktur. Bir şey - ya güvenilirlik ve güven ya da hız. Ve bir karışımınız var.
 
Artyom Trishkin :
İlginçtir ki, zaman ne için, neden listedeki sonuncuyu ve hatta bir döngüyü seçtiyseniz, kapanış saatini neden hatırlıyorsunuz? Ve neden takas ve komisyonu dikkate almıyorsunuz? OrderProfit()>0 olsa bile gerçek karı negatif olabilir. Doğrudan sipariş listesiyle çalışıyorsanız, son kapanış saati için arama döngüsünün kodundan parça bırakmanıza bile gerek yoktur. Bir şey - ya güvenilirlik ve güven ya da hız. Ve bir karışımınız var.

teklif ediyorsun

   if ( OrderSelect (OrdersHistoryTotal(),SELECT_BY_POS,MODE_HISTORY))

Böyle yap?

Adam sadece kâr emri istedi, neden istemediği bir şeyle uğraşsın ki? Ama sana katılıyorum....

 

Lütfen bana MT4'te MQL4'te 20 çubuktan sonra bir açık emrin nasıl kapatılacağını, yani bir emrin nasıl açılacağını ve 20 yeni çubuğun nasıl göründüğünü söyleyin - emir kapanır. (sadece 1 sipariş her zaman açıktır). Nedense, bu kod benim için strateji test cihazında çalışmıyor, ancak çalışması gerekiyor.


bu kodun anlamı şudur: açık emir olup olmadığını kontrol edin, yoksa bir emir açın ve 1. çubuğun açılış fiyatını "z" değişkenine yazın, ardından her tik ile açılış fiyatını kontrol ediyoruz. 20. çubuk ve zamanla aynı 1. çubuk 20. olduğunda, fiyatı "z" değişkeninde kaydedilen fiyatla çakışacak ve ardından sipariş kapatılacaktır. (Tabii ki süreçte fiyat çakışmaları olabilir ama bu çok nadir olacaktır ayrıca değişkenlere 1. çubuğun bir kaç parametresini daha yazabilirsiniz)


 double z; //объявление переменной

           //ОТКРЫТИЕ ОРДЕРА
           if ( OrdersTotal () == 0 ) // если нет открытых ордеров то открывать ордер
              {
               OrderSend ( Symbol (), OP_SELL, 0.1 , Bid, 3 , Bid+ 150 * Point , Bid- 10 * Point );
                   z = Open[ 1 ]; // здесь переменной "z" присваивается цена открытия 1-го бара
              }
             else

           Print ( "ORDER NE USTANOVLEN!!!" );




           //ЗАКРЫТИЕ ОРДЕРА

     if (z==Open[ 20 ])   //если цена записанная в переменную "z" равна цене 20-го бара, то закрывать ордер
        {
           

             //-----------------код закрывает все ордера--------------------
   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 ());

  }
//------------конец кода закрывающего ордер------------------
           
           
        }
       else
       Print ( "ORDER NE ZAKRYT!!!" );
 
BEGEMOT32 :

Lütfen bana MT4'te MQL4'te 20 çubuktan sonra bir açık emrin nasıl kapatılacağını, yani bir emrin nasıl açılacağını ve 20 yeni çubuğun nasıl göründüğünü söyleyin - emir kapanır. (sadece 1 sipariş her zaman açıktır). Nedense, bu kod benim için strateji test cihazında çalışmıyor, ancak çalışması gerekiyor.


bu kodun anlamı şudur: açık emir olup olmadığını kontrol edin, yoksa bir emir açın ve 1. çubuğun açılış fiyatını "z" değişkenine yazın, ardından her tik ile açılış fiyatını kontrol ediyoruz. 20. çubuk ve zamanla aynı 1. çubuk 20. olduğunda, fiyatı "z" değişkeninde kaydedilen fiyatla çakışacak ve ardından sipariş kapatılacaktır. (Tabii ki süreçte fiyat çakışmaları olabilir ama bu çok nadir olacaktır ayrıca değişkenlere 1. çubuğun bir kaç parametresini daha yazabilirsiniz)


her şeyi kendim çözdüm, int start () dışında bir değişken bildirmek zorunda kaldım - şimdi iyi çalışıyor
 
BEGEMOT32 :
her şeyi kendim çözdüm, int start () dışında bir değişken bildirmek zorunda kaldım - şimdi iyi çalışıyor

Biraz basitleştirdim, ancak kodunuzda hala hatalar var

 //ОТКРЫТИЕ ОРДЕРА
if ( OrdersTotal ()== 0 ) // если нет открытых ордеров то открывать ордер
   if ( OrderSend ( Symbol (),OP_SELL, 0.1 ,Bid, 3 ,Bid+ 150 * Point ,Bid- 10 * Point )< 0 )
       Print ( "ORDER NE USTANOVLEN!!!" );

//-----------------код закрывает все ордера--------------------
   bool    result;
   int     error;
   while ( OrdersTotal ()> 0 )
     {
       if ( OrderSelect ( 0 ,SELECT_BY_POS,MODE_TRADES))
        {
         if (iBarShift(OrderSymbol(), Period (),OrderOpenTime())== 20 )
           {
             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 ());

     }
 

Çoklu para birimi danışmanı yazıyorum, ancak danışmanı farklı para birimlerine asarsam neden aynı anda farklı fiyatlar döndürdüğünü anlayamıyorum.

Kısaca, kodda:

init'te

 EventSetTimer ( 60 );

OnTimer'da()

 MqlTick last_tick;
if ( SymbolInfoTick ( "EURNZD" ,last_tick))
{
    Print ( "Last Ask: " , last_tick.ask);
}

Bir danışmanı EURNZD'de test edersem, örneğin

2015.05.18 00:07:00 LatAsk : 1.5370

Danışmanı başka bir döviz çiftine asarsam

2015.05.18 00:07:00 LatAsk : 1.5323

değerler kökten farklıdır ve ikinci durumda, programa göre böyle bir değer en az birkaç saat olamaz

Test cihazında, tüm keneler ticaret modundadır, ana çift değilse, test cihazındaki değerler yaklaşık değerlerdir.

Bunun Meta Trade 5 olduğunu eklemeyi unuttum

İlk çıktığınızda fiyatın yanlış olduğu ortaya çıktı, testi tekrar yapın fiyat normal

 
1. Tie hacminde kaç tane yukarı ve aşağı tik olduğunu geçmişten öğrenebilir misiniz?

2. Autochartis'i sildiğimden bu yana birkaç ay geçti ve günlükteki mesajlar görünüyor. Program dosyaları açmaya çalışıyor.

Otomatik çizelge nasıl tamamen silinir?

2015.05.25 15:36:42.983 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Volatility.ex4' [2]
2015.05.25 15:36:42.983 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Key Levels.ex4' [2]
2015.05.25 15:36:42.982 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Chart Patterns.ex4' [2]