Önceki kene değeri - sayfa 4

 
Bu daha akıcı kod için teşekkürler Nicholi. Bazı denemelerden sonra, ask_diff'i kayan nokta olarak bildirmenin, doğru sayıda basamakla farklılıklar ürettiğini, ancak tür dönüştürmeden kaynaklanan olası veri kaybı hakkında bir derleme hatası ürettiğini buldum. Farklılıklarımda çok küçük yanlışlıklar veya derleme uyarısı almak arasında seçim yapmam gerekiyor gibi görünüyor. İkincisi, ticaret kararları için daha iyi olurdu, ancak ask_diff'te en fazla beş ondalık basamak elde etmek için başka birinin çözümü var mı?
 
rdone :
Bu daha akıcı kod için teşekkürler Nicholi. Bazı denemelerden sonra, ask_diff'i kayan nokta olarak bildirmenin, doğru sayıda basamakla farklılıklar ürettiğini, ancak tür dönüştürmeden kaynaklanan olası veri kaybı hakkında bir derleme hatası ürettiğini buldum. Farklılıklarımda çok küçük yanlışlıklar veya derleme uyarısı almak arasında seçim yapmam gerekiyor gibi görünüyor. İkincisi, ticaret kararları için daha iyi olurdu, ancak ask_diff'te en fazla beş ondalık basamak elde etmek için başka birinin çözümü var mı?

ask_diff'iniz int yazmalı ve bunun yerine şöyle görünmelidir.

int diff = int ( round ((current.ask - last.ask) / _Point ));
 
NormalizeDouble ve DoubleToString'i yeni keşfettim. Hey, bu işte ilk günüm...
 
rdone :
NormalizeDouble ve DoubleToString'i yeni keşfettim. Hey, bu işte ilk günüm...
Amacım, mevcut Sor ile önceki Sor (Bölüm 1) arasındaki farkı belirlemek ve ardından bu farklılıkların toplamını tutmaktır (Bölüm 2). Bölüm 1 çalışır, ancak Bölüm 2 yalnızca önceki Talep tutarını döndürür. Birisi nerede yanlış yaptığımı görebilir ve bazı kurs düzeltmeleri sağlayabilir mi?
 double ask_curr;
double ask_prev;
double ask_diff;
double diff_ask;
MqlTick tick_curr, tick_prev;
void OnTick ()
  {
   if ( SymbolInfoTick ( Symbol (),tick_curr))
     {
       /* Part 1 */
      ask_curr = tick_curr.ask;
      ask_prev = tick_prev.ask;
      ask_diff = ask_curr - ask_prev;
       Print ( DoubleToString (ask_diff, 5 ));
       /* Part 2 */
      diff_ask = diff_ask + ask_diff;
       Print ( DoubleToString (diff_ask, 5 ));     
      tick_prev = tick_curr;
     }
   else Print ( "SymbolInfoTick() failed, error = " , GetLastError ());
  }
 
Çoğu zaman olduğu gibi, kod benim istediğimi yapmak yerine yapması gerekeni yapıyordu. Mantık, tick_prev'in her zaman doldurulmasını gerektirir, ancak ilk onayda doğru değildir. İlk tıklamada tick_prev doldurulmasını gerektirmeyen bir mantıkla ilgileniyorum, ancak aksi halde bu işe yarıyor.
 
rdone :
Çoğu zaman olduğu gibi, kod benim istediğimi yapmak yerine yapması gerekeni yapıyordu. Mantık, tick_prev'in her zaman doldurulmasını gerektirir, ancak ilk onayda doğru değildir. İlk tıklamada tick_prev doldurulmasını gerektirmeyen bir mantıkla ilgileniyorum, ancak aksi halde bu işe yarıyor.
Ve şimdi kodla.
 double ask_curr;
double ask_prev;
double ask_diff;
double diff_ask;
int notfirst;
MqlTick tick_curr, tick_prev;
void OnTick ()
  {
   if ( SymbolInfoTick ( Symbol (),tick_curr))
     {
       if (notfirst > 0 )
      {
       /* Part 1 */
      ask_curr = tick_curr.ask;
      ask_prev = tick_prev.ask;
      ask_diff = ask_curr - ask_prev;
       Print ( DoubleToString (ask_diff, 5 ));
       /* Part 2 */
      diff_ask = diff_ask + ask_diff;
       Print ( DoubleToString (diff_ask, 5 ));
      }
      tick_prev = tick_curr;
      notfirst = 1 ;  
     }
   else Print ( "SymbolInfoTick() failed, error = " , GetLastError ());
  }
 
rdone :
Çoğu zaman olduğu gibi, kod benim istediğimi yapmak yerine yapması gerekeni yapıyordu. Mantık, tick_prev'in her zaman doldurulmasını gerektirir, ancak ilk onayda doğru değildir. İlk tıklamada tick_prev doldurulmasını gerektirmeyen bir mantıkla ilgileniyorum, ancak aksi halde bu işe yarıyor.
 double diff_ask= 0 ;
MqlTick tick_curr, tick_prev={ 0 };
void OnTick ()
  {
   if ( SymbolInfoTick ( Symbol (),tick_curr))
     {
       /* Part 1 */
      diff_ask += tick_prev.ask!= 0.0 ?(tick_curr.ask-tick_prev.ask): 0.0 ;
       Print ( DoubleToString (diff_ask, 5 ));
       /* Part 2 */
       //diff_ask = diff_ask + ask_diff;
       //Print(DoubleToString(diff_ask,5));     
      tick_prev = tick_curr;
     }
   else Print ( "SymbolInfoTick() failed, error = " , GetLastError ());
  }
 
Ernst Van Der Merwe :
Bu, elde etmeyi arzu ettiğim bir kodlama düzeyidir. Teşekkürler Ernst!
diff_ask += tick_prev.ask!= 0.0 ?(tick_curr.ask-tick_prev.ask): 0.0 ;
 
rdone :
Bu, ulaşmak istediğim bir kodlama seviyesi. Teşekkürler Ernst!

Çiftler nadiren eşit olduğundan, puan farkını bir çift olarak saklamak istemezsiniz. Bir tamsayı değeri olarak saklamak istiyorsunuz. Örneğin (1.00001 - 1.00000) / 0.00001 = 1 puan. Dolayısıyla, yalnızca iki onay işaretini karşılaştırıyorsanız, kodunuzu daha kompakt hale getirebilir ve yalnızca MqlTick'in alt sınıfını yapabilir ve nokta farkı için bir int özniteliği ekleyebilirsiniz.

 struct MyTick : public MqlTick { int point_diff;} tick_curr={ 0 }, tick_prev={ 0 };
void OnStart ()
{
   tick_prev = tick_curr;
   SymbolInfoTick ( _Symbol , tick_curr);
   if (tick_prev.ask != 0.0 ){
      tick_curr.point_diff = int ( round (
         (tick_curr.ask - tick_prev.ask) / _Point
      ));
       printf ( "%.5f -> %.5f: %d point diff" ,
         tick_prev.ask,
         tick_curr.ask,
         tick_curr.point_diff
      );
   }
}