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

 
Merhaba! 2 sembol kullanan bir gösterge oluşturmaya çalıştım (örneğin EURUSD ve GBPUSD), çizmiyor (4806 hatası veriyor...) OnInit işlevinde her sembolün gösterge tutamaçlarını (örneğin iRSI) alıyorum, OnCalculate'de işlev Gösterge verilerini arabelleklere kopyalarım ve onlarla daha fazla işlemle harcarım... ve böylece, bir sembolün gösterge verileri (göstergeyi eklediğim grafikteki sembolle eşleşen sembol için) normal olarak alınır, ancak ikinci sembolün gösterge verileri alınmadı... yani. sadece göstergenin iliştirildiği çizelgedeki sembolle eşleşen sembol için veri alır...neyi yanlış yapıyorum?
 
FinEngineer :
Merhaba! 2 sembol kullanan bir gösterge oluşturmaya çalıştım (örneğin EURUSD ve GBPUSD), çizmiyor (4806 hatası veriyor...) OnInit işlevinde her sembolün gösterge tutamaçlarını (örneğin iRSI) alıyorum, OnCalculate'de işlev Gösterge verilerini arabelleklere kopyalarım ve onlarla daha fazla işlemle harcarım... ve böylece, bir sembolün gösterge verileri (göstergeyi eklediğim grafikteki sembolle eşleşen sembol için) normal olarak alınır, ancak ikinci sembolün gösterge verileri alınmadı... yani. sadece göstergenin iliştirildiği çizelgedeki sembolle eşleşen sembol için veri alır...neyi yanlış yapıyorum?
Bu yüzden kodun soruna neden olan kısmını gösterin.
 

Kodun tamamını gönderiyorum çünkü hiçbir şey çalışmıyor, her şey mql4'te çok daha basitti, belki de alışkanlıktan dolayı... bu tutamaçlar ve yardımcı arabellekler aklınızı başınızdan alıyor.

Bence anlam açık (2 ilişkilendirme aracının rsi'sindeki fark), lütfen yardım edin ... hataları işaret edin?

#property telif hakkı "Telif hakkı 2012, MetaQuotes Software Corp."
#özellik bağlantısı "http://www.mql5.com"
#özellik sürümü "1.00"

//---- gösterge çizim özellikleri
#özellik göstergesi_tamponları 3
#özellik göstergesi_label1 "Pair_delta_RSI"
#özellik göstergesi_type1 DRAW_LINE
#özellik göstergesi_color1 Kırmızı
#özellik göstergesi_style1 STYLE_SOLID
#özellik göstergesi_width1 1
//giriş parametreleri
girdi dizisi Symbol1_Name = "EURUSD";
girdi dizisi Symbol2_Name = "GBPUSD";
giriş intPeriodRSI=7;
input bool Ters Çevirme=yanlış;
ENUM_APPLIED_PRICE girin InpAppliedPrice=PRICE_CLOSE;

çift DeltaRSI_Buffer[];
çift RSI1_Buffer[];
çift RSI2_Buffer[];

int RSI1_Handle;
intRSI2_Handle;

int OnInit()
{
SetIndexBuffer(0,DeltaRSI_Buffer,INDICATOR_DATA);
SetIndexBuffer(1,RSI1_Buffer,INDICATOR_HESAPLAMALAR);
SetIndexBuffer(2,RSI2_Buffer,INDICATOR_HESAPLAMALAR);

RSI1_Handle=iRSI(Symbol1_Name,0,PeriodRSI,PRICE_CLOSE);//gösterge tutamaçlarını al
RSI2_Handle=iRSI(Symbol2_Name,0,PeriodRSI,PRICE_CLOSE);
dönüş(0);
}

int OnHesapla(sabit int oranlar_toplam,sabit int önceki_hesaplanmış,
const tarihsaat &Saat[],
const double &Aç[],
const çift &Yüksek[],
const çift &Düşük[],
const double &Kapat[],
const uzun &TickVolume[],
const uzun &Hacim[],
const int &Spread[])
{
int hesaplanmış=ÇubuklarHesaplanmış(RSI1_Handle);
if(hesaplanmış<oran_toplam)
{
Print("RSI1_Handle'ın tüm verileri hesaplanmadı (",hesaplandı","bars . Error",GetLastError());
dönüş(0);
}
hesaplanmış=BarlarHesaplanmış(RSI2_Handle);
if(hesaplanmış<oran_toplam)
{
Print("RSI2_Handle'ın tüm verileri hesaplanmadı (",hesaplandı,"bars . Error",GetLastError());
dönüş(0);
}
//--- tüm verileri kopyalayamayız
int to_copy;
if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
başka
{
to_copy=rates_total-prev_hesaplanmış;
if(önceki_hesaplanmış>0) to_copy++;
}
// RSI1 arabelleğini al
if(CopyBuffer(RSI1_Handle,0,0,to_copy,RSI1_Buffer)<=0)
{
Print("RSI1 alınamadı! Hata",GetLastError());
dönüş(0);
}
//RSI2 arabelleğini al
if(CopyBuffer(RSI2_Handle,0,0,to_copy,RSI2_Buffer)<=0)
{
Print("RSI2 alınamadı! Hata",GetLastError());
dönüş(0);
}
//---
int limiti;
if(önceki_hesaplanmış==0)
sınır=0;
başka limit=prev_hesaplanmış-1;
//gösterge delta rsi'yi hesapla
for(int i=limit; i<rates_total; i++)
DeltaRSI_Buffer[i]=RSI1_Buffer[i]-RSI2_Buffer[i];
dönüş(oranlar_toplam);
}

Automated Trading and Strategy Testing
Automated Trading and Strategy Testing
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 

1 numaralı hata

SRC anahtarını kullanmayı reddetme

 

Örneğin, standart kullanıcı tanımlı MACD göstergesini alıp içindeki satırı değiştirirsek benzer bir hata oluşur.

ExtFastMaHandle=iMA(NULL,0,InpFastEMA,0,MODE_EMA,InpAppliedPrice);

üzerinde

ExtFastMaHandle=iMA("EURUSD",0,InpFastEMA,0,MODE_EMA,InpAppliedPrice);

MACD, EURUSD grafiğine eklenirse, her şey çizilir, başka bir tabloya eklenirse, 4806 hatası görünür... Göstergede istediğiniz kadar sembol kullanmayı nasıl mümkün kılarsınız?

Bana daha önce ortaya konan göstergeyi nasıl çalıştıracağımı söylerseniz, çok minnettar olacağım.

 
mario065 :

Lester : Buraya bir şablon koydum, yemek yedim ve içeride değişiklik yaptım, nasıl emekleneceğini gösterdim.

https://www.mql5.com/ru/forum/6343/page73

İstemiyorsanız, değişkeni doğru bir şekilde düşünmeniz gerekir.

Değişken başarılarla, Schablon dosyasının özünü yakaladım, koşullarımı biraz yönlendirdim ve Yaşasın - duraklar ve karlar belirlendi. Ancak, benim için önemli bir çıkmaz var - kene üzerine değil, bir sonraki muma ayarlandılar. Danışmanın bir parçasını getiriyorum.

   double buy_trail = 0 ;
   double sel_trail = 0 ;
   double SL,T_P,Open;
   ulong L_S;
  
   if ( PositionSelect ( _Symbol ))
  {
     Open = PositionGetDouble ( POSITION_PRICE_OPEN );
     SL   = PositionGetDouble ( POSITION_SL );
     T_P  = PositionGetDouble ( POSITION_TP );
     Bid  = SymbolInfoDouble ( _Symbol , SYMBOL_BID );
     Ask  = SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
     L_S  = SymbolInfoInteger ( _Symbol , SYMBOL_TRADE_STOPS_LEVEL );
     buy_trail = NormalizeDouble (Bid - Open, Digits ());
     sel_trail = NormalizeDouble (Open - Ask, Digits ()); 
    
     if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
    {
     if (! PositionGetDouble ( POSITION_SL ))
      {
      PositionModify( _Symbol , NormalizeDouble ((Open-STR-TR), Digits ()), NormalizeDouble ((Open+TP), Digits ()));
      }
 
Lester :

Değişken başarılarla, Schablon dosyasının özünü yakaladım, koşullarımı biraz yönlendirdim ve Yaşasın - duraklar ve karlar belirlendi. Ancak, benim için önemli bir çıkmaz var - kene üzerine değil, bir sonraki muma ayarlandılar. Kodun bir kısmını gönderiyorum.

 input double TP            = 0.003 ;
input double STR           = 0.0012 ;
input double TR            = 0.0002 ;
//=============================================== 
//Един вид извикване на модификация на отворената позиция
   double buy_trail = 0 ;
   double sel_trail = 0 ;
   double SL,T_P,Open;
   ulong L_S;
Ну ладно-обяснения:

   if ( PositionSelect ( _Symbol )){ //Ест ли позиция по символа
     Open = PositionGetDouble ( POSITION_PRICE_OPEN ); //цена опен для поза
     SL   = PositionGetDouble ( POSITION_SL ); //цена стоп для поза
     T_P  = PositionGetDouble ( POSITION_TP ); //цена тейк для поза
     Bid  = SymbolInfoDouble ( _Symbol , SYMBOL_BID ); //цена бид
     Ask  = SymbolInfoDouble ( _Symbol , SYMBOL_ASK ); //цена аск
     L_S  = SymbolInfoInteger ( _Symbol , SYMBOL_TRADE_STOPS_LEVEL ); //стоп ниво,если ест такое-оно в пункты
     buy_trail = NormalizeDouble (Bid - Open, Digits ()); //вычисляем разстояние от цена бид и цена опен позиции-ето для бай
     sel_trail = NormalizeDouble (Open - Ask, Digits ()); //вычисляем разстояние от цена опен позиции и цена аск-ето для сел
     if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY ) //если ест бай поза
      {
       if (buy_trail > STR) //если разстояние болше указаное
       {
         if ( NormalizeDouble ((Bid - STR), Digits ()) >= Open && Open > SL)
//если цена бид минус указаное разстояние болше щем цена опен и цена опен болше цена стоп-вызиваем модификация
//сама модификация-для стоп будет цена опен,цена тейк не меняем.
          {
           ModifyPosition( _Symbol ,Open,T_P);
          }
           if ( NormalizeDouble ((Bid - TR), Digits ()) > SL && Open <= SL)
//если цена бид минус указаное разстояние TR = 0.0002 болше уже от новый стоп(который поменяли уже) и цена опен менше новый стоп 
//вызиваем модификация
//сама модификация - для стоп будет прошлый стоп минус стоп ниво* _Point(что б стали пипси) плюс указаное TR,цена тейк не меняем.
//Т.е. будем двигат стоп через каждые 2 пипса  
           {
            ModifyPosition( _Symbol , NormalizeDouble (((SL - L_S * _Point ) + TR), Digits ()),T_P);
           }
        }
      }
     if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
      {
       if (sel_trail > STR)
       { 
         if ( NormalizeDouble ((Ask + STR), Digits ()) <= Open && Open < SL)
          {
           ModifyPosition( _Symbol ,Open,T_P);
          }
           if ( NormalizeDouble ((Ask + TR), Digits ()) < SL && Open >= SL)
           {
            ModifyPosition( _Symbol , NormalizeDouble (((SL +L_S * _Point )- TR), Digits ()),T_P);
           }
        }
      }
     } 
//===============================================

Bazı eylemlerin gerçekleştiği koşulları yazmak her zaman gereklidir, ancak her şey düşünülür ve böylece mantık vardır.

Yardım için print(Print(" ", ); ) yazın ve neyin size geri döndüğünü görün - yazdıklarınızın sonucunu.

 
mario065 :

Tüm açıklamalar açık ve işe yarıyor. Ancak bu, "başabaş" ve "sondaki" bir değişikliktir. Ve bir sipariş açtıktan sonra Stoplimit ve TakeProfit ayarı için bir değişiklik yazmam gerekiyor, yani

1. Sipariş açma

--------

2. Limiti durdurmak için değişiklik (bu henüz değil!)

  if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
    {
     if (! PositionGetDouble ( POSITION_SL ))
      {
      PositionModify( _Symbol , NormalizeDouble ((Open-STR-TR), Digits ()), NormalizeDouble ((Open+TP), Digits ()));
      }

------

3. bile kırmak için değişiklik

4.Sondaki değişiklik

5. Bir siparişi kapatma


2. noktaya göre, değişiklik gerçekleşir, ancak bir sonraki çubuğun başlangıcı ile, ancak siparişin açılmasını takiben onay işaretine bağlanması gerekir.

 

Yemekleri açmak için bir fonksiyon yazılır:

Сама функция(символ,обем,проскалзивание,стоп,тейк,магик)
С вызова функции можно все сразу поставит.
bool BuyPositionOpen( const string symbol, double volume, ulong deviation, double StopLoss, double Takeprofit, int Magic)     
     if (Какое то условие)
      {
       BuyPositionOpen( _Symbol ,Lot, 0 , NormalizeDouble (Ask - 0.003 , _Digits ), NormalizeDouble (Ask + 0.003 , _Digits ),MagicNumber);
      }
     if (Какое то условие)
      {
       SellPositionOpen( _Symbol ,Lot, 0 , NormalizeDouble (Bid + 0.003 , _Digits ), NormalizeDouble (Bid - 0.003 , _Digits ),MagicNumber);
      }
Функция для закрития:
Сама функция(символ,проскалзивание,магик)
bool BuyPositionClose( const string symbol, ulong deviation, int Magic)
// Логика за затваряне на дългите
       if (Какое то условие){
         BuyPositionClose( _Symbol , 0 ,MagicNumber);}                        
// Логика за затваряне на късите
       if (Какое то условие){
         SellPositionClose( _Symbol , 0 ,MagicNumber);} 

Если не хочете сразу ставит стоп и тейк,тогда:
//=============================================== 
//Един вид извикване на модификация на отворената позиция
   double buy_trail = 0 ;
   double sel_trail = 0 ;
   double SL,T_P,Open;
   ulong L_S;
   if ( PositionSelect ( _Symbol )){
     Open = PositionGetDouble ( POSITION_PRICE_OPEN );
     SL   = PositionGetDouble ( POSITION_SL );
     T_P  = PositionGetDouble ( POSITION_TP );
     Bid  = SymbolInfoDouble ( _Symbol , SYMBOL_BID );
     Ask  = SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
     L_S  = SymbolInfoInteger ( _Symbol , SYMBOL_TRADE_STOPS_LEVEL );
     buy_trail = NormalizeDouble (Bid - Open, Digits ());
     sel_trail = NormalizeDouble (Open - Ask, Digits ());
     if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
      {
if (SL = 0 && T_P = 0 ) //если стоп и тейк равни нулю-вызиваете модофикация и там акуратно ложите нужная вам цена
{
  ModifyPosition( _Symbol , NormalizeDouble ((Open - 0.003 ), Digits ()), NormalizeDouble ((Open + 0.003 ), Digits ()));
}
//Далше вам понятно:
       if (buy_trail > STR)
       {
         if ( NormalizeDouble ((Bid - STR), Digits ()) >= Open && Open > SL)
          {
           ModifyPosition( _Symbol ,Open,T_P);
          }
           if ( NormalizeDouble ((Bid - TR), Digits ()) > SL && Open <= SL)
           {
            ModifyPosition( _Symbol , NormalizeDouble (((SL - L_S * _Point ) + TR), Digits ()),T_P);
           }
        }
      }
     if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
      {
       if (sel_trail > STR)
       { 
         if ( NormalizeDouble ((Ask + STR), Digits ()) <= Open && Open < SL)
          {
           ModifyPosition( _Symbol ,Open,T_P);
          }
           if ( NormalizeDouble ((Ask + TR), Digits ()) < SL && Open >= SL)
           {
            ModifyPosition( _Symbol , NormalizeDouble (((SL +L_S * _Point )- TR), Digits ()),T_P);
           }
        }
      }
     } 
//=============================================== 
 
Bu başlıkta MQL5 geliştiricileri var!??? Acaba soruyu yanlış başlıkta mı soruyorum? O zaman geliştiricilere nasıl soru soracağımı söyle ??? Soru yukarıda belirtilmiştir, deneyimli bir programcı için temeldir...