Çaydanlıktan gelen sorular - sayfa 53

 
Göstergelerin koşulsuz ve aptalca (cehaletten) yeniden oluşturulmasını, göstergenin makul (nadir ve zorunlu olarak) oluşturulmasıyla karıştırmayın. İlk durumda, yüz kat fren ve kaynak sızıntısı alırsınız ve ikincisinde - ideal bir iş.
 
Renat :
Göstergelerin koşulsuz ve aptalca (cehaletten) yeniden oluşturulmasını, göstergenin makul (nadir ve zorunlu olarak) oluşturulmasıyla karıştırmayın. İlk durumda, yüz kat fren ve kaynak sızıntısı elde edersiniz ve ikincisinde - ideal bir iş.

Karlson'ın bilmeden bir hata yaptığını çok iyi anlıyorum, bu hatanın özünü de anlıyorum.

Ama onun sorununu çözmek için makul bir plan sunun. Bir kişinin göstergede yazılan kodu kullanması gerekiyor, ancak bu kodun parametre(ler)i, gösterge verilerine her çağrıdan önce dinamik olarak belirleniyor mu?

Bir dll içermesine rağmen bir çözümüm var, ancak saf mql'yi savunuyorsunuz, bu yüzden mql'de bir çözüm sunun.

ZY Olaylarda OnCalculate() ve hesaplamalardan daha önce bahsetmiştim, ancak bir olay aracılığıyla üç parametreyi aktarmak mümkündür. Benim çözümümde burada bir dll imdada yetişiyor, dizinin adresini uzun bir parametre ile ileten bir dll, bu adreste gösterge verisi elde ediyor.

Mql'de bir çözümünüz varsa, parmağınızı gösterin, insanlar burada anlıyor.

 
Urain :

Karlson'ın bilmeden bir hata yaptığını çok iyi anlıyorum, bu hatanın özünü de anlıyorum.

Ama onun sorununu çözmek için makul bir plan sunun. Bir kişinin göstergede yazılan kodu kullanması gerekiyor, ancak bu kodun parametre(ler)i, gösterge verilerine her çağrıdan önce dinamik olarak belirleniyor mu?

Gerçekten kaç farklı gösterge oluşturmanız gerekiyor? Kesinlikle 10'dan fazla değil, aksi takdirde sadece kaynak israfı olacaktır.

Parametrelerde kesinlikle değişiklikler olduğundan, gerektiğinde gerekli göstergenin eklendiği bir göstergeler koleksiyonu oluşturabilirsiniz. Açıkça 10'dan az gösterge varsa ve bunların açık bir anlamı varsa (ilk, onaylayan, düzeltici vb.), gerekli parametrelerle adlandırılmış tutamaç değişkenleri oluşturabilirsiniz.

 
Urain :

Ama onun sorununu çözmek için makul bir plan sunun. Bir kişinin göstergede yazılan kodu kullanması gerekiyor, ancak bu kodun parametre(ler)i, gösterge verilerine her çağrıdan önce dinamik olarak belirleniyor mu?

biraz düşündüm. Kod parametre(ler)i, gösterge verilerine yapılan her çağrıdan önce dinamik olarak belirlenirse, neden bu tür parametreleri belirleme prosedürünü gösterge koduna da zorlamıyorsunuz? Başka bir deyişle, her şey, kesinlikle tüm hesaplamalar göstergede.

Yoksa böyle bir kampanyanın temelde imkansız olduğu durumlar var mı?

 
Lütfen bana bu kadar basit bir göstergede neden sıfır (sağdan ilk) çubuğunun haftalık grafik dışında her yerde hesaplanmadığını söyleyin?

 #include <MovingAverages.mqh>
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_color1 LightBlue
#property indicator_type1   DRAW_LINE
#property indicator_width1 2

input int PERIOD = 80 ;
input ENUM_MA_METHOD   method = MODE_SMA ;
input ENUM_APPLIED_PRICE PRICE = PRICE_CLOSE ;
double Uptrend[];
double ExtRsiArray_TF2[];
double mabuf[];
int handleMA,handleMA2;

int OnInit ()
  {
   SetIndexBuffer ( 0 , Uptrend);
   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0 );  
   ArraySetAsSeries (Uptrend, true );
   handleMA= iMA ( NULL , 0 , PERIOD, 0 , method, PRICE);
   handleMA2= iMA ( NULL , 0 , PERIOD/ 2 , 0 , method, PRICE);
   return ( 0 );
  }
  
double WMA( int ai_0, int a_period_4) {
int some;
if (a_period_4==PERIOD)
 if ( CopyBuffer (handleMA, 0 ,ai_0, 1 ,ExtRsiArray_TF2)<= 0 )
  { Alert ( "Error" , GetLastError ());
   return ( 0 );
  }
some=PERIOD/ 2 ;
if (a_period_4==some)
 if ( CopyBuffer (handleMA2, 0 ,ai_0, 1 ,ExtRsiArray_TF2)<= 0 )
  { Alert ( "Error" , GetLastError ());
   return ( 0 );
  }
return (ExtRsiArray_TF2[ 0 ]);
}

int OnCalculate ( const int rates_total,      
                 const int prev_calculated, 
                 const int begin,          
                 const double & price[] 
   )
  { ArraySetAsSeries (price, true );
     int counted_bars = prev_calculated; 
     if (counted_bars < 0 ) return (- 1 ); 
     int x = 0 ; 
     int p = MathSqrt (PERIOD);              
     int e = rates_total - counted_bars + PERIOD + 1 ; 
     double vect[], trend[]; 
     if (e > rates_total) e = rates_total;    
     ArrayResize (vect, e); 
     ArraySetAsSeries (vect, true );
     ArrayResize (trend, e); 
     ArraySetAsSeries (trend, true );
     ArrayResize (mabuf, e); 
     ArraySetAsSeries (mabuf, true );
     for (x = 0 ; x < e; x++)        vect[x] = 2 *WMA(x, PERIOD/ 2 ) - WMA(x, PERIOD);
     if (method== MODE_SMA )
    SimpleMAOnBuffer(e,prev_calculated,PERIOD+ 1 ,p,vect,mabuf);

     for (x = 0 ; x < e-PERIOD; x++) Uptrend[x] = mabuf[x];
     return (rates_total);                
  }
 
Yedelkin :

Biraz düşündüm. Kod parametre(ler)i, gösterge verilerine yapılan her çağrıdan önce dinamik olarak belirlenirse, neden bu tür parametreleri belirleme prosedürünü gösterge koduna da zorlamıyorsunuz? Başka bir deyişle, her şey, kesinlikle tüm hesaplamalar göstergede.

Yoksa böyle bir kampanyanın temelde imkansız olduğu durumlar var mı?

Bu tür durumlar vardır, örneğin, parametreler başka bir gösterge(ler) tarafından hesaplandığında ve danışmana geri döndüğünde ve danışman, örneğin bir nörona dayanarak hangi modeli kullanacağına karar verir. Parametre setlerinden hangisinin uygulanacağını önceden bilmiyorlar.

 
Expert :
Lütfen bana bu kadar basit bir göstergede neden sıfır (sağdan ilk) çubuğunun haftalık grafik dışında her yerde hesaplanmadığını söyleyin?


Hata) burada değiştirilir: SimpleMAOnBuffer(e,prev_hesaplanmış, PERIOD+ 1 ,p,vect,mabuf); e - oranları_toplam yerine ve her şey çalıştı)
 
Expert :
Hata) burada değiştirildi: SimpleMAOnBuffer(e,prev_calculated,PERIOD+ 1 ,p,vect,mabuf); e - oranları_toplam yerine ve her şey çalıştı)

Uzman lakabına sahip bir kişinin hatalarını düzenle? mizah konusunda bu gereklidir.
 

Çoklu para birimi oluşturmaya çalışıyorum. Şimdiye kadar Nikolai Kositsin'in " Farklı enstrümanlar üzerinde işlem yapan bir Uzman Danışman Yaratmak " makalesinde önerdiği şemaya karar verdim. Testi farklı araçlardan, ancak aynı parametrelerle çalıştırırsanız, sonuçlar farklı olduğunda bir sorunla karşılaştım. Forumu inceledim ve birçok kişinin bu sorunun OnTimer() işlevi kullanılarak çözülebileceği sonucuna vardığını gördüm. Andrey Khatimlyansky burada tavsiyede bulundu:

Отвяжитесь от тиков конкретного инструмента ( OnTick ) - это же мультивалютник! Работайте по таймеру или ловите момент образования бара на всех рабочих инструментах, это будет надежнее.

Tüm enstrümanlarda bar oluşum anını yakalamaya çalıştım ama istediğim sonucu alamadım.

Örneğin:

Yeni bir çubuk tanımlamak için tasarlanan fonksiyonda, sembolü ve zaman çerçevesini açıkça belirtiyorum.

 bool isNewBar( string Symbol_, ENUM_TIMEFRAMES Timeframe)
{
 // В статической переменной будем помнить время открытия последнего бара
 static datetime last_time = 0 ;
 // Текущее время
 datetime lastbar_time = ( ENUM_SERIES_INFO_INTEGER ) SeriesInfoInteger (Symbol_,Timeframe, SERIES_LASTBAR_DATE );

 // Если это первый вызов функции
 if (last_time == 0 )
   {
     // Установим время и выйдем 
    last_time = lastbar_time;
     return ( false );
   }

 // Если время отличается
 if (last_time != lastbar_time)
   {
     // Запомним время и вернем true
    last_time = lastbar_time;
     return ( true );
   }
 // Дошли до этого места - значит бар не новый, вернем false
 return ( false );
}

OnTick() işlevinde, Nikolai Kositsin tarafından önerilen şema.

Örneğin:

 void OnTick ()
{ 
 // Объявление массивов переменных для торговых сигналов  
 static bool UpSignal[ 2 ], DnSignal[ 2 ];

 // Получение торговых сигналов
 TradeSignalCounter( 0 , остальные параметры);
 TradeSignalCounter( 1 , остальные параметры);

 // Совершение торговых операций
 TradePerformer( 0 , остальные параметры);
 TradePerformer( 1 , остальные параметры);
}


isNewBar(Symbol,Timeframe) işlevi, ticaret işlemlerinin yürütüldüğü işlevde, yani TradePerformer(parameters) içinde çağrılır.

Örneğin:

 bool TradePerformer(параметры)
{

...

 if (isNewBar(Symbol_,Timeframe))
   {
    Trailing_Stop(параметры);
   
    Open_Source_Position(параметры);
   }
 return ( true );
}


Yani her enstrüman için ayrı ayrı her seferinde yeni bir çubuk kontrol edilir. Yeni bir çubuk yoksa, bir sonraki sembolü kontrol ederiz. Ve böylece her kene üzerinde. Ama bu seçenek çalışmıyor.

Sunulan şemada çok para birimli bir Uzman Danışmanda yeni bir çubuğun kontrolünün nasıl doğru bir şekilde uygulanacağını söyleyebilir misiniz?
 
Urain :
Uzman lakabına sahip bir kişinin hatalarını düzenle? mizah konusunda bu gereklidir.
Bu forumda, Uzmanların kodundaki hataları ırk ve zaman diliminden bağımsız olarak düzeltebilirsiniz ve düzeltmelisiniz :)