Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 66

 
Roger :

Sürükleme dediğin aslında öyle değil, farklı bir şekilde hesaplanıyor ve davranışı mantıksız olabilir.


Terim kavramlarımız örtüşmesin, ama beni anlıyor musunuz?

Sorun çözüldü, işte burada:

 double getLots( double newSL) {
   int opnTime = 0 ; // время открытия трейда для цикла пересчета позиций
   double lotSum = 0 ; 
   for ( int i = 0 ; i <= OrdersTotal ()- 1 ; i++) {
       OrderSelect (i, SELECT_BY_POS);     
       if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) { 
         opnTime = OrderOpenTime(); 
         if (OrderType() == OP_BUY)    { lotSum += OrderLots() * (newSL - OrderOpenPrice()) / Point ; }
         if (OrderType() == OP_SELL)   { lotSum -= OrderLots() * (newSL - OrderOpenPrice()) / Point ; }
      }
   }   
   return (lotSum);
}

Bu fonksiyon tüm açık işlemleri hesaba katmadı, bu nedenle çevrim koşullarının değiştirilmesi gerekiyordu. Şimdi şöyle görünüyor:

 double AcountProfitEx( double Price) {
   double    ProfitSum   = 0 ;
   for ( int i = OrdersTotal ()- 1 ; i >= 0 ; i--) {
       OrderSelect (i, SELECT_BY_POS);
       if (OrderType() == OP_BUY)
      ProfitSum -= (OrderOpenPrice() - Price) * OrderLots() / Point ;
       if (OrderType() == OP_SELL)
      ProfitSum += (OrderOpenPrice() - Price) * OrderLots() / Point ;
   }
   return (ProfitSum);
}

Bu fonksiyon, belirlediği fiyat seviyesindeki tüm açık işlemlerden elde edilen kâr miktarını hesaplar. Ancak benim de katıldığım yayılmayı dikkate almadığına dair alıntılanan bir görüş var. Bu görüşün yazarı şu çözümü önerdi:

 double getLots( double newSL)
{
   double TickValue, delta;
   double lotSum;
   string SymbolName ;
   
   SymbolName = Symbol ();
   TickValue = MarketInfo( SymbolName , MODE_TICKVALUE) / Point ;
   delta = ( newSL - Bid ) * TickValue;

   lotSum = 0.0 ; 
   for ( int i = 0 ; i <= OrdersTotal ()- 1 ; i++)
   {
       OrderSelect (i, SELECT_BY_POS);     
       if ( OrderSymbol() == SymbolName )
      { 
         if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * delta; }
         if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * delta; }
      }
   }   
   return (lotSum);
}

Ama dürüst olmak gerekirse, yazdığı gibi onu anlamıyorum:

Yayılma dikkate alınmadı. Bu, mevcut fiyattan sonuç sayılarak düzeltilebilir.
Önerdiği algoritmayı anlamadığım bir şey var, orada yayılma nasıl hesaba katılıyor? Biri açıklayabilir mi?
 
Mepkypuu :

Ama dürüst olmak gerekirse, yazdığı gibi onu anlamıyorum:

Önerdiği algoritmayı anlamadığım bir şey var, orada yayılma nasıl hesaba katılıyor? Biri açıklayabilir mi?

OrderProfit(), mevcut Ask'taki kısa pozisyonlar için hesaplanır ve bu, mevcut spread'in değerlerinin dikkate alındığı yerdir. Yayılım değişmezse, fiyat mevcut Teklifin değerinden newSL'ye değiştiğinde, bir pozisyonun karı (herhangi bir, Al veya Sat, karşılık gelen işaretle) delta değeri kadar değişecektir. operatöre yazılır:

delta = ( newSL - Teklif ) * TickValue;

Kısacası, OrderProfit() her şeyi spreadleri hesaba katarak hesaplar.OrderProfit() kullanarak belirli bir andaki sonucu ( mevcut fiyat ) sabitleriz. Ayrıca, sadece fiyat değişimini izleyebiliyoruz.

 
Mislaid :

OrderProfit(), mevcut Ask'taki kısa pozisyonlar için hesaplanır ve bu, mevcut spread'in değerlerinin dikkate alındığı yerdir. Yayılım değişmezse, fiyat mevcut Teklifin değerinden newSL'ye değiştiğinde, bir pozisyonun karı (herhangi bir, Al veya Sat, karşılık gelen işaretle) delta değeri kadar değişecektir. operatöre yazılır:

delta = ( newSL - Teklif ) * TickValue;

Kısacası OrderProfit() her şeyi spreadleri hesaba katarak hesaplar.OrderProfit() kullanarak belirli bir andaki sonucu (mevcut fiyat) sabitleriz. Ayrıca, sadece fiyat değişimini izleyebiliyoruz.

Sanırım anlamaya başlıyorum, belki de şöyle daha doğru:

 if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * ((newSL - Bid) / Point * MarketInfo( SymbolName , MODE_TICKVALUE)); }
if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * ((newSL - Ask ) / Point * MarketInfo( SymbolName , MODE_TICKVALUE)); }

Sonuçta, kısa pozisyonlar için OrderProfit, Satış fiyatından hesaplanır, değil mi?

Bu arada, MarketInfo( SymbolName , MODE_TICKVALUE) bana USD mevduat para birimi olan EURUSD çifti üzerinde 329.02 veriyor, bu yüzden bu fonksiyon benim için her şeyi olması gerektiği gibi görmüyor.

 

Şimdiye kadar bir numara yapmaya karar verdim, yani. MarketInfo( SymbolName , MODE_TICKVALUE) başka bir şekilde:

 double GetTickValue( string CurrentQuote) {
   string AccountCurr = AccountCurrency();
   string BaseCurr = StringSubstr (CurrentQuote, 0 , 3 );
   string CurrentCurr = StringSubstr (CurrentQuote, 3 , 3 );
   
   if (CurrentCurr == AccountCurr)  
       return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE));
   if (BaseCurr == AccountCurr)
       return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) / MarketInfo(CurrentQuote, MODE_BID));
   if ((CurrentCurr != AccountCurr) && (BaseCurr != AccountCurr))  
       return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) * MarketInfo( StringConcatenate (BaseCurr,AccountCurr), MODE_BID) / MarketInfo(CurrentQuote, MODE_BID));
}
 
Mepkypuu :

Şimdiye kadar bir numara yapmaya karar verdim, yani. MarketInfo( SymbolName , MODE_TICKVALUE) başka bir şekilde:

Yazıldığı gibi, bu yüzden doğru. Teklifin ne kadar hareket edeceğine göre Ask, yayılma değişmeden aynı miktarda hareket edecektir.
 
Mislaid :
Yazıldığı gibi, bu yüzden doğru. Teklifin ne kadar hareket ettiğine göre Ask, yayılma değişmeden aynı miktarda hareket edecektir.

Kişisel uygulamadan, yayılma genellikle değişkendir ve oldukça güçlüdür). Keskin hareketlerle, beşli bir işarette 8'den 80 puana kadar yayılmada bir artış gözlemledim.
 
Çift köşeyi (güvenilir bir şekilde) kodlamak mümkün mü?
 
001 :
Bir çift tepe noktasını (güvenilir bir şekilde) kodlamak mümkün mü?
Yapabilir.
 

Bir danışmanı test ederken, günlükte bir hata çıkıyor

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Hata 4002 oluştu (Dizi indeksi - aralık dışında)

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Alış emri açma girişimi. Cevap işleniyor..

Buna göre siparişler açılmaz. Hata nasıl düzeltilir? Oluşmasının nedenleri nelerdir?

yardım etmekten memnuniyet duyarım.

 
alexey1979621 :

Bir danışmanı test ederken, günlükte bir hata çıkıyor

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Hata 4002 oluştu (Dizi indeksi - aralık dışında)

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Alış emri açma girişimi. Cevap işleniyor..

Buna göre siparişler açılmaz. Hata nasıl düzeltilir? Oluşmasının nedenleri nelerdir?

yardım etmekten memnuniyet duyarım.

Yalnızca terminal mesajlarından çok az şey netleşecek, danışman kodunu göndermezseniz çok az kişi size yardımcı olacaktır. Dizide bir yerde, varsayımlardan biri olarak var olmayan bir veri yığını yazıyorsunuz, ancak tahmin etmek benim profilim değil.