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

 
İyi günler, bir döngüde hesaplanabilecek aynı türden birçok gösterge arabelleği vardır, ancak bir dizi gösterge arabelleği nasıl yapılır? Yapı üzerinden denedim ve her şey yolunda görünüyordu, SetIndexBuffer() hatasız çalıştı, ancak OnCalculate() oluştuğunda dizi boyutları değişmiyor ve 0 kalıyor. döngü, muhtemelen "buff_0" , "buff_1" vb. gibi adlarla, ancak nasıl yapacağımı bilmiyorum ((Ve sonra çok uzun bir sayfa elde edilir (
 
SanAlex :

Muhtemelen istediğiniz gibi - ortaya çıktı.

Teşekkür ederim!

Bu doğru, ama tam olarak aklımdaki şey değil !!! emir trende göre (göstergeye göre) verilir ve alıma göre kapatılır ve kapanır kapanmaz aynı yönde (trende göre) yeni bir emir açılır ama bu sadece bir kısım benim fikrim.

İkincisi, trend tersine döndüğünde (fiyat hareketi yönündeki bir değişiklikle ilgili gösterge sinyali) alım tarafından kapatılmayan emrin kapatılmaması gerektiğidir (ki bunu yaptınız) ve şimdi Martngale'yi ben bağlarım. Belli bir adım, çarpan ve alım ortalaması ile trendi takip etmeyen açık siparişler .

Kısacası, iki parça çiftler halinde çalışmalıdır.

 
Alexey Viktorov :

Dün görmek için bu mucizeyi indirdim ... Ve aniden beni tirnetten mahrum ettiler. Fırtınanın ardından gün sonuna kadar teknik çalışma. Bu yüzden, tembellikten, bu mucizeyi burada yayınlanan MQL5'te yeniden yazmaya karar verdim.

İyi olmadan kötü olmadığı ortaya çıktı………

Çok teşekkürler!

Fikrimi gerçekleştirmeyi başarırsan belki işine yarar!

 
VANDER :
Yapıyı denedim ve her şey yolunda görünüyordu.

Bu işe yaramaz mı?

 int size= 100 ;

struct All
   {
   double buff[];
   } all[];

int OnInit ()
   {
   IndicatorBuffers(size);
   ArrayResize (all,size);
   for ( int i= 0 ; i<size; i++)
      {
       SetIndexBuffer (i,all[i].buff);
      SetIndexStyle(i, DRAW_LINE );
      }
   return ( INIT_SUCCEEDED );
   }

int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
   {
   for ( int i= 0 ; i<size; i++)
      {
      all[i].buff[shift]=i;
      }
   return (rates_total);
   }
 

Sprut 185 :

ve şimdi buna Martngale uygulamanız gerekiyor, yani. Belli bir adım, çarpan ve alım ortalaması ile trendi takip etmeyen açık siparişler.

Kısacası, iki parça çiftler halinde çalışmalıdır.

Bir sonraki pozisyonun ALIŞ'ta 2-4-8-16 çift lotla ve SATIŞ'ta 2-4-8-16'nın tersi ile açılacağını mı söylüyorsunuz ???

Böyle bir işlevim var - kendimi böyle kör ettim.

 //+------------------------------------------------------------------+
//| ENUM_LOT_RISK                                                    |
//+------------------------------------------------------------------+
enum LotMax
  {
   Lot= 0 ,   // Lots
   Lotx2= 1 , // Lots*2
   Risk= 2 ,   // Risk
  };
//+------------------------------------------------------------------+
input LotMax InpLotRisk              = Risk;         // : Lots,- Lots*2,- Risk
input double MaximumRisk             = 0.02 ;         // : Maximum Risk in percentage
input double DecreaseFactor          = 3 ;             // : Descrease factor
 //+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized( void )
  {
   double price= 0.0 ;
   double margin= 0.0 ;
//--- select lot size
   if (! SymbolInfoDouble ( _Symbol , SYMBOL_ASK ,price))
       return ( 0.0 );
   if (! OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 1.0 ,price,margin))
       return ( 0.0 );
   if (margin<= 0.0 )
       return ( 0.0 );
   double lot= NormalizeDouble ( AccountInfoDouble ( ACCOUNT_MARGIN_FREE )*MaximumRisk/margin, 2 );
//--- calculate number of losses orders without a break
   if (DecreaseFactor> 0 )
     {
       //--- select history for access
       HistorySelect ( 0 , TimeCurrent ());
       //---
       int     orders= HistoryDealsTotal ();   // total history deals
       int     losses= 0 ;                     // number of losses orders without a break
       for ( int i=orders- 1 ; i>= 0 ; i--)
        {
         ulong ticket= HistoryDealGetTicket (i);
         if (ticket== 0 )
           {
             Print ( "HistoryDealGetTicket failed, no trade history" );
             break ;
           }
         //--- check symbol
         if ( HistoryDealGetString (ticket, DEAL_SYMBOL )!= _Symbol )
             continue ;
         //--- check Expert Magic number
         if ( HistoryDealGetInteger (ticket, DEAL_MAGIC )!=UNO_MAGIC)
             continue ;
         //--- check profit
         double profit= HistoryDealGetDouble (ticket, DEAL_PROFIT );
         if (profit> 0.0 )
             break ;
         if (profit< 0.0 )
            losses++;
        }
       //---
       if (losses> 1 )
         lot= NormalizeDouble (lot-lot*losses/DecreaseFactor, 1 );
     }
//--- normalize and check limits
   double stepvol= SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_STEP );
   lot=stepvol* NormalizeDouble (lot/stepvol, 0 );
   double minvol= SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MIN );
   if (lot<minvol)
      lot=minvol;
   double maxvol= SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MAX );
   if (lot>maxvol)
      lot=maxvol;
//--- return trading volume
   return (lot);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double OptimizedBuy( void )
  {
   double PROFIT_BUY= 0.00 ;
   for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--) // returns the number of open positions
     {
       string    position_GetSymbol= PositionGetSymbol (i); // GetSymbol позиции
       if (position_GetSymbol==m_symbol.Name())
        {
         if (m_position.PositionType()== POSITION_TYPE_BUY )
           {
            PROFIT_BUY=PROFIT_BUY+m_position.Select( Symbol ());
           }
        }
     }
   double Lots=MaximumRisk;
   double ab=PROFIT_BUY;
   switch (InpLotRisk)
     {
       case Lot:
         Lots=MaximumRisk;
         break ;
       case Lotx2:
         if (ab> 0 && ab<= 1 )
            Lots= MaximumRisk* 2 ;
         if (ab> 1 && ab<= 2 )
            Lots= MaximumRisk* 4 ;
         if (ab> 2 && ab<= 3 )
            Lots= MaximumRisk* 8 ;
         if (ab> 3 )
            Lots= TradeSizeOptimized();
         break ;
       case Risk:
         Lots=TradeSizeOptimized();
         break ;
     }
   return (Lots);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double OptimizedSell( void )
  {
   double PROFIT_SELL= 0.00 ;
   for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--) // returns the number of open positions
     {
       string    position_GetSymbol= PositionGetSymbol (i); // GetSymbol позиции
       if (position_GetSymbol==m_symbol.Name())
        {
         if (m_position.PositionType()== POSITION_TYPE_SELL )
           {
            PROFIT_SELL=PROFIT_SELL+m_position.Select( Symbol ());
           }
        }
     }
   double Lots=MaximumRisk;
   double ab=PROFIT_SELL;
   switch (InpLotRisk)
     {
       case Lot:
         Lots=MaximumRisk;
         break ;
       case Lotx2:
         if (ab> 0 && ab<= 1 )
            Lots= MaximumRisk* 2 ;
         if (ab> 1 && ab<= 2 )
            Lots= MaximumRisk* 4 ;
         if (ab> 2 && ab<= 3 )
            Lots= MaximumRisk* 8 ;
         if (ab> 3 )
            Lots= TradeSizeOptimized();
         break ;
       case Risk:
         Lots=TradeSizeOptimized();
         break ;
     }
   return (Lots);
  }
//+------------------------------------------------------------------+

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

bir pozisyon açarken değiştirilmelidir - burada OptimizedBuy() ve OptimizedSell() ile InpLots yerine

       if (m_trade.PositionOpen( Symbol (), ORDER_TYPE_BUY , OptimizedBuy() ,price, 0.0 , 0.0 ))
       if (m_trade.PositionOpen( Symbol (), ORDER_TYPE_SELL , OptimizedSell() ,price, 0.0 , 0.0 ))
 
SanAlex :

Bir sonraki pozisyonun ALIŞ'ta 2-4-8-16 çift lotla ve SATIŞ'ta 2-4-8-16'nın tersi ile açılacağını mı söylüyorsunuz ???

Böyle bir işlevim var - kendimi böyle kör ettim.

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

bir pozisyon açılırken değiştirilmelidir - burada OptimizedBuy() ve OptimizedSell() ile InpLots yerine

ancak bu işlev için bu işlevin de olması arzu edilir - kârla ne kapatabilir (para biriminde)

 input double InpTProfit              = 40000 ;         // : Take Profit --> (In currency the amount)
input double InpSLoss                = 1000000 ;       // : Stop Loss --> (In currency the amount)
 //+------------------------------------------------------------------+
//| ProfitOnTick closing                                             |
//+------------------------------------------------------------------+
void ProfitOnTick( void )
  {
//---
   double PROFIT_BUY= 0.00 ;
   double PROFIT_SELL= 0.00 ;
   int total= PositionsTotal ();
   for ( int i=total- 1 ; i>= 0 ; i--)
     {
       string    position_GetSymbol= PositionGetSymbol (i);
       if (position_GetSymbol==m_symbol.Name())
        {
         if (m_position.PositionType()== POSITION_TYPE_BUY )
           {
            PROFIT_BUY=PROFIT_BUY+ PositionGetDouble ( POSITION_PROFIT );
           }
         else
           {
            PROFIT_SELL=PROFIT_SELL+ PositionGetDouble ( POSITION_PROFIT );
           }
        }
       if (PROFIT_BUY<-InpSLoss || PROFIT_BUY>=InpTProfit)
        {
         CheckForCloseBuy();
        }
       if (PROFIT_SELL<-InpSLoss || PROFIT_SELL>=InpTProfit)
        {
         CheckForCloseSell();
        }
     }
  }
//+------------------------------------------------------------------+
 
SanAlex :

ancak bu işlev için bu işlevin de olması arzu edilir - kârla ne kapatabilir (para biriminde)

Fikrimin anlamını ve oluşturulan Expert Advisor'ın işleyişini daha anlaşılır bir şekilde açıklamaya çalışayım.

Basit bir Martin'e ihtiyacımız var - örneğin, yalnızca siparişlerin açılmasının gösterge sinyaline (trendi takip ederek) dayanması ve Autoprofit gibi değil - kartın nasıl düştüğünü eklemeniz gereken Autoprofit 3. ..... ve bu kadar.

Ekli dosyadakiyle yaklaşık olarak aynı çıktı parametreleriyle.
Dosyalar:
pbx0dcw.jpg  201 kb
 
Sprut 185 :

Fikrimin anlamını ve oluşturulan Expert Advisor'ın işleyişini daha anlaşılır bir şekilde açıklamaya çalışayım.

Basit bir Martin'e ihtiyacımız var - örneğin, yalnızca siparişlerin açılmasının gösterge sinyaline (trendi takip ederek) dayanması ve Autoprofit gibi değil - kartın nasıl düştüğünü eklemeniz gereken Autoprofit 3. ..... ve bu kadar.

bu nedenle göstergenin sinyaline göre açılır - yalnızca sinyal ters görünüyorsa, zaten diğer yönde açılacaktır. ve bu pozisyon kârla kapatılmazsa kârla kapanana kadar askıda kalır. Sinyal diğer yöne dönüp o açık olanı kapattıysa size yakışmıyor.

 
SanAlex :

bu nedenle göstergenin sinyaline göre açılır - yalnızca sinyal ters görünüyorsa, zaten diğer yönde açılacaktır. ve bu pozisyon kârla kapatılmazsa kârla kapanana kadar askıda kalır. Sinyal diğer yöne dönüp o açık olanı kapattıysa size yakışmıyor.

Bu doğru ....... ve o pozisyon kârla kapatılmazsa kârla kapanana kadar askıda kalır.

Ve kârda kapanmayan pozisyonun ( örneğin, bir alımda ) kalması ve kırmızıya belirli bir adıma gitmesi gerekir, burada başka bir emrin (alışta ) çarpılan hacim ve ortalamada gizlice kırmızı açılır vs. trend ortaya çıkana kadar, ancak iplik üzerindeki pozisyonların açılması durmayacaktı.

Bu yüzden burada 2 bloğun aynı anda çalışması gerektiğini yazdım - Martin ve gösterge.

Bir şeyi iyi açıklamadıysam, Skype üzerinden bir gösteri başlatmaya ve nasıl görünmesi gerektiğini açıkça göstermeye hazırım.

 
Sprut 185 :

Bu doğru ....... ve o pozisyon kârla kapatılmazsa kârla kapanana kadar askıda kalır.

Ve kârda kapanmayan pozisyonun ( örneğin, satın almada ) kalması ve kırmızıya doğru belirli bir adıma gitmesi gerekir; burada, çarpılan hacimli ve gizlice kırmızıda bir ortalamaya sahip başka bir siparişin (satın almada) olacağı yerde. açık vb. trend ortaya çıkana kadar, ancak iplik üzerindeki pozisyonların açılması durmayacaktı.

Bu yüzden burada 2 bloğun aynı anda çalışması gerektiğini yazdım - Martin ve gösterge.

Bir şeyi iyi açıklamadıysam, Skype üzerinden bir gösteri başlatmaya ve nasıl görünmesi gerektiğini açıkça göstermeye hazırım.

Martin, yalnızca gösterge sinyali ters olduğunda mı yoksa bundan bağımsız olarak mı açılmalı?

Örnek: Göstergeye göre bir Alış pozisyonu açılır. Fiyat belirli bir mesafe kadar düştü ve gösterge zaten Sat gösteriyor. Alış pozisyonları açılmalı mı?