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

 
Seric29 :

Böyle bir soru: Double'lerin 0'dan 4'e, datatame'in 5'ten 9'a, int'nin 10'dan 14'e kadar saklanacağı tek boyutlu bir dizi oluşturmak istiyorum. Bunu mql4'te düzenlemek mümkün mü, eğer öyleyse, bana nasıl olduğunu gösterin, yapılarla bir örnek gördüm, ancak c++'daydı, ancak sitenin bağlantısını kaybettim?

Her tür için belirli dizi hücreleriniz varsa, dizi yerine bir yapı yapın.

 
Koldun Zloy :

Her tür için belirli dizi hücreleriniz varsa, dizi yerine bir yapı yapın.

ne yazık ki görevi resmileştiremiyor bile

bir yandan, iletişim C++ / MQL'de katı yazımdan uzaklaşmak istiyor gibi görünüyor, burada bir tartışma ile iyi bir konu, ancak bunun ona yardımcı olacağından şüpheliyim https://www.mql5.com/ru/ forum/294094

tartışma sırasında (bence 3 aydır devam ediyor mu? ) sürekli olarak @Seric29'un fonksiyon imzasının tanımından uzaklaşması ve bir tür "hayalet" fonksiyon alması gerektiği ortaya çıkıyor. içine isteğe bağlı sayıda parametre iletebileceğiniz

daha sonra tartışma sırasında tüm bunlara çok boyutlu dinamik dizilerin katılması gerektiği ve bu dizilerin fonksiyona parametre olarak geçirilmesi gerektiği ortaya çıktı.

onlar. çözümü sürekli olarak "yerden gelen çığlıklar" ile biten resmi bir görev yok, geliştiriciler bir şeyin işlevselliğini azalttı ve bana döngü operatörlerinin kaynak kodlarını verdi, onları yeniden yapacağım, o zaman işte burada sonuncusu:

Serik29 :
mql4 geliştiricilerine nasıl mektup yazılır, derleyici kodu nasıl görülür, bu kadar statik olmaması için ona ek özellikler eklemek mümkün müdür?

... genel olarak, böyle bir şey ... "beyin alınması" ifadesi söylenebilecek en az şey))))

 

Bu yüzden detay vermiyorum.

Temel bilgileri öğrenmekten kaçış yok.

 
Koldun Zloy :

Temel bilgileri öğrenmekten kaçış yok.

Burada ilginç olan, bir kişinin temel bilgileri öğrenmemesi, ancak tüm bunları zaten bildiğini göstermeye çalışması ve tüm meta alıntılar onun işini yapmasını engelliyor)

 
Taras Slobodyanik :

Burada ilginç olan, bir kişinin temel bilgileri öğrenmemesi, ancak tüm bunları zaten bildiğini göstermeye çalışması ve tüm meta alıntılar onun işini yapmasını engelliyor)

Selamlar. Yetkili bir video izledim "MQL4'ten MQL5'e - Metatrader 5 için Uzman Danışman nasıl yeniden yazılır".
Yazara büyük saygılar. Kendim denemeye karar verdim. yazdı. Fikir şu:
1. Girişlerde dtriger = 1 ayarladım - Buy açılır.
2. Girişlerde dtriger = -1 ayarladım - Satış açılır.
3. Girişlerde dtriger = 0 olarak ayarladım - tüm açık olanlar kapalı.
MT5'te zıt pozisyonları tutmanın mümkün olmadığını yardım sayfalarında okudum,
ve bende onlara sahibim.
Soru: mevcut pozisyonun kapanışı ne zaman doğru bir şekilde kaydedilir?
açma dönüşü (ters).
Çok teşekkürler.

#include <Ticaret\PositionInfo.mqh>
#include <Ticaret\Ticaret.mqh>
#include <Ticaret\SymbolInfo.mqh>
#include <Ticaret\OrderInfo.mqh>

cPositionInfo o_position;
CTrade o_trade;
CSymbolInfo o_symbol;
COorderInfo o_order;

giriş int tetik = 0;
giriş çift StartLot = 0.01;
giriş çift lpos_volume = 1.0;
giriş intStep = 10;
giriş int MagicNumber = 12345; // Sihirli nuaber
giriş int kayması = 30; // kayma

int tetikleyici;
int dStep;

//+------------------------------------------- --------------------+
//| uzman başlatma işlevi |
//+------------------------------------------- --------------------+
int OnInit()
{
dAdım = adım ;
tetikleyici = tetikleyici;

if (!o_symbol.Name(Symbol()))
dönüş(INIT_FAILED);

Yeniler();

o_trade.SetExpertMagicNumber(MagicNumber) ;

if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK))
{
o_trade.SetTypeFilling(ORDER_FILLING_FOK);
}
else if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
{
o_trade.SetTypeFilling(ORDER_FILLING_IOC);
}
başka
{
o_trade.SetTypeFilling( ORDER_FILLING_RETURN );
}
o_trade.SetDeviationInPoints(Kayma);

if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
{
dAdım = 10 ;
}

dönüş(INIT_SUCCESSED);
}
//+------------------------------------------- --------------------+
//| Uzman başlatmasızlaştırma işlevi |
//+------------------------------------------- --------------------+
geçersiz OnDeinit(const int nedeni)
{
}
//+------------------------------------------- --------------------+
//| Uzman onay işlevi |
//+------------------------------------------- --------------------+
geçersiz OnTick()
{
tarihsaat lpos_time = 0;
çift lpos_price_open = 0.0;
ENUM_POSITION_TYPE lpos_type = -1;
int konum_sayısı = 0;
çift toplam_kâr = 0;

for (int i = PositionsTotal() - 1; i>=0; i--)
{
if (o_position.SelectByIndex(i))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
if (o_position.Time() > lpos_time)
{
lpos_time = o_position.Time(); //SiparişAçıkZamanı();
lpos_price_open = o_position.PriceOpen(); //SiparişAçıkFiyat();
lpos_type = o_position.PositionType() ; //Sipariş türü();
}

pos_count++;
sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
}
}
}

// Bekleyen siparişlerin sayısını sayın
int stop_count=0;

for (int i=OrdersTotal()-1; i >=0; i--)
{
if (o_order.SelectByIndex(i))
{
if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
stop_count++;
}
}

if (! Yenileme Oranları())
dönüş;

if(dtrigger == 0 )
{
Hepsini kapat();
dönüş;
}

// + ----- İlk siparişi aç ++++++++++
if (pos_count == 0 && stop_count == 0 )
{
if ( dtriger == -1 && lpos_type != POSITION_TYPE_SELL)
{
o_trade.Sell(StartLot * lpos_volume , o_symbol.Name()); // SEL L 11111
}

if ( dtriger == 1 && lpos_type != POSITION_TYPE_BUY )
{
o_trade.Buy(StartLot * lpos_volume , o_symbol.Name()); // BU Y 11111
}
}


// + ----- Çevir ++++++++++++++++++++++++++++++++

eğer (pos_count>0)
{
if(lpos_type == POSITION_TYPE_BUY )
{
if ( dtriger == -1 )
{
o_trade.Sell(StartLot * lpos_volume , o_symbol.Name()); // SEL L +++++
}
}

if (lpos_type==POSITION_TYPE_SELL )
{
if ( tetik == 1 )
{
o_trade.Buy(StartLot * lpos_volume , o_symbol.Name()); // BU Y +++++
}
}
}


if(pos_count>0 && stop_count>0)
DeleteStopOrders() ;

}
//------------------------------------------------ -----------
bool YenilemeOranları()
{
if (!o_symbol.RefreshRates())
dönüş(yanlış);

if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
dönüş(yanlış);

dönüş(doğru);
}
//--- ------------------------------------------------ --------- ------------
bool IsFillingTypeAllowed (dize sembolü, int fill_type)
{
int doldurma = (int)SymbolInfoInteger(sembol, SYMBOL_FILLING_MODE);

dönüş((doldurma && dolgu_türü) == dolgu_türü) ;
}

// ------------------------------------------------ --
Tümünü Kapat() geçersiz
{
for (int dizin = PositionsTotal()-1; dizin >=0; dizin--)
{
if (o_position.SelectByIndex(index))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
o_trade.PositionClose(o_position.Ticket());
}
}
}
}

//------------------------------------------------ -----------
// Bekleyen tüm siparişleri sil
//------------------------------------------
geçersiz DeleteStopOrders()
{
for (int i = OrdersTotal() - 1; i >= 0; i-- )
{
if (o_order.SelectByIndex(i))
if(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
o_trade.OrderDelete(o_order.Ticket());
}
}

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

 
procom :

Selamlar....

Lütfen kodu doğru yapıştırın:


 
Artyom Trishkin :

Lütfen kodu doğru yapıştırın:


tamam
 #include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>

CPositionInfo   o_position;
CTrade        o_trade;
CSymbolInfo        o_symbol;
COrderInfo         o_order;

input int           triger            = 0 ;
input double     StartLot             = 0.01 ;
input double     lpos_volume       = 1.0 ;
input int           Step         = 10 ;
input int           MagicNumber    = 12345 ;       //      Magic   nuaber
input int           Slippage          = 30 ;         //   slippage

int dtriger;
int dStep;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   dStep = Step ;
   dtriger = triger ;

   if (!o_symbol.Name( Symbol ()))
     return ( INIT_FAILED );
   
   RefreshRates();
   
   o_trade.SetExpertMagicNumber(MagicNumber) ;

   if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK ))
   { 
      o_trade.SetTypeFilling( ORDER_FILLING_FOK );
   }
   else if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC ))
   { 
      o_trade.SetTypeFilling( ORDER_FILLING_IOC );
   }
   else 
   {
      o_trade.SetTypeFilling( ORDER_FILLING_RETURN );
   }
      o_trade.SetDeviationInPoints(Slippage);
   
   if (o_symbol. Digits () == 3 || o_symbol. Digits () == 5 )
   {
      dStep = 10 ;
   }
   
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
       datetime               lpos_time          =         0 ;
       double                 lpos_price_open    =         0.0 ;
       ENUM_POSITION_TYPE    lpos_type           =        - 1 ;
       int                       pos_count               =         0 ;
       double                 sum_profit         = 0 ;
 
   for ( int i = PositionsTotal () - 1 ; i>= 0 ; i--)
   {
       if (o_position.SelectByIndex(i))
      {
         if (o_position. Symbol () == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
             if (o_position.Time() > lpos_time)
            {  
               lpos_time       = o_position.Time();             //OrderOpenTime();
               lpos_price_open = o_position.PriceOpen();       //OrderOpenPrice();
               lpos_type       = o_position.PositionType() ;   //OrderTipe();
             }  
            
            pos_count++;
            sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
          }     
       }     
    }          

   // Считаем кол-во отложенных ордеров
   int stop_count= 0 ;

   for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--) 
   {
       if (o_order.SelectByIndex(i)) 
      {
         if (o_order. Symbol () == o_symbol.Name() && o_order.Magic() == MagicNumber) 
           stop_count++;
      }
   }

   if (!RefreshRates())
     return ;
     
   if (dtriger == 0 )
   {
      CloseAll();
       return ;               
   } 
   
   // + -----    Откраваем Первый ордер   ++++++++++
 if (pos_count == 0   && stop_count == 0     )
   {
       if ( dtriger == - 1 &&  lpos_type != POSITION_TYPE_SELL )
      {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   11111
      }
      
       if ( dtriger == 1 &&  lpos_type != POSITION_TYPE_BUY )
      {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());   //   B U Y    11111
      }
   }
                          

// +  -----   Переворот    ++++++++++++++++++++++++++++   

if (pos_count> 0 )
   {
       if (lpos_type == POSITION_TYPE_BUY )
      {
         if ( dtriger == - 1 )
         {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   +++++
         }
      }

       if (lpos_type== POSITION_TYPE_SELL )
      {
         if ( dtriger == 1 )
         {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());       //   B U Y    +++++
         }
      }
   }


   if (pos_count> 0 && stop_count> 0 ) 
     DeleteStopOrders() ;
  
} 
//-----------------------------------------------------------
bool RefreshRates()
{
   if (!o_symbol.RefreshRates())
     return ( false ) ;
     
     if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0 )
       return ( false );
      
     return ( true );
}  
//---  --------------------------------------------------------- 
 bool IsFillingTypeAllowed ( string symbol, int fill_type)
{ 
   int filling = ( int ) SymbolInfoInteger (symbol, SYMBOL_FILLING_MODE ); 
 
   return ((filling && fill_type) == fill_type) ;
} 
 
 //  -------------------------------------------------- 
   void CloseAll()
{
   for ( int index = PositionsTotal ()- 1 ; index >= 0 ; index--)
   {
       if (o_position.SelectByIndex(index))
      {
         if (o_position. Symbol () == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            o_trade.PositionClose(o_position.Ticket());
         }
      }  
    } 
 } 
  
 //----------------------------------------------------------- 
 // Delete all pending orders
 //-------------------------------------
 void DeleteStopOrders()
 {
     for ( int i = OrdersTotal () - 1 ; i >= 0 ; i-- ) 
   {
       if (o_order.SelectByIndex(i))
         if (o_order. Symbol () == o_symbol.Name() && o_order.Magic() == MagicNumber)
            o_trade.OrderDelete(o_order.Ticket());
   }
 } 
 
//+------------------------------------------------------------------+
Dosyalar:
Stend_t1.mq5  12 kb
 
Igor Makanu :

En azından C++ ile ilgili bir kitap okumaya başlayın, sorularınız beyin patlaması, teknik terimler yazıyorsunuz, ilk bakışta belirli bir soru soruyormuşsunuz gibi görünüyor ama aslında özü anlamadan sadece terimlerle işlem yapıyorsunuz.. .. makro ne döndürecek ? nereye dönecek? makronun gövdesinde yeniden yüklenebilir bir fonksiyon var.... Sorunuzun neye benzediğini bile açıklayamıyorum.

Makronun ne olduğunu anlamak için bu terimi doğru yazın, makro İkamesi ne olduğunu anlamanız belki daha kolay olur

mql4'te C++'ın olanakları da kesilir, başka bir deyişle, dil çok statiktir. Fikrimin başarısız olduğunu söyleyebiliriz, sınıflar olmadan basit bir aşırı yükleme yazdım, argümanlar ekledim ve onlara 0 atadım, bir makroda çağırmaya çalıştım, 3 fonksiyon var hatası aldım, yani. Hangisini arayacağını ve daha sonra hangi taşlarla karşılaşacağım konusunda nasıl sessiz kaldığımı hala boyaman gerekiyor. Muhtemelen hiçbir şey yapmamak daha iyidir, o zaman yanlış gidemezsin.

 
Seric29 :

mql4'te C++'ın olanakları da kesilir, başka bir deyişle, dil çok statiktir.

özellikle ne kesildi?

başka bir deyişle, gerekli değildir, özellikle Google bile “ çok statik bir dil” bilmediğinden, C ++ başlangıçta statik olarak yazılmış bir dildir ve düşünceler anlamsızdır - aynen böyle

Serik29 :

Muhtemelen hiçbir şey yapmamak daha iyidir, o zaman yanlış gidemezsin.

Kısa RTFM olacağım ( lurkmore )

 

Tamamen estetik bir soru.

Burada kendi resmimi nasıl yapabilirim? MT4