Yeni başlayanlardan sorular MQL4 MT4 MetaTrader 4 - sayfa 17

 
Babu Bonappan :

OrderOpenPrice, anladığım kadarıyla tam olarak ihtiyacım olanı veriyor. Ancak yalnızca mevduat para biriminin dolar olması ve işlem gören çiftin EUR/USD olması şartıyla. Bu durumda, OrderOpenPrice'ta, marjı kolayca hesaplayabileceğinizi bilerek, siparişin açıldığı andaki mevduat para birimine göre temel para biriminin döviz kuru korunur.

Ancak bu koşullardan en az biri karşılanmazsa, tek bir sipariş için marj miktarı nasıl alınır? Teklifin temel para biriminin açılış anındaki mevduat para birimine göre döviz kurunu nereden alabilirim?

Evet, saniyeye kadar doğru bir sipariş açılış saatimiz var. Ama ne alabiliriz? Maksimum olarak - istenen enstrümanın dakika mumunun parametreleri. Ancak, marjın hesaplandığı oranın tam değeri değil. Ancak AccountMargin işlevi bir şekilde bunu alıyor! Tam olarak nasıl olduğunu anlamak isterim.

Marjı hesaplamak için üç formüle ihtiyacınız var.

Mevduat para birimine bağlı olarak, herhangi bir döviz çifti için marjı hesaplayacaksınız.

Hesaplamada hata olabileceği gerçeği bir gerçektir. Ancak, hesaplama sonucunun temel mevduat para biriminin yüzde birine yuvarlanmasıyla elde edilenden çok daha az olacaktır, yani. dolar ise, sent demek istiyorum.

not

AccountMargin geçerli, yani son değerdir

 

Ancak, MarketInfo'yu ( OrderSymbol (), MODE_MARGINREQUIRED )* kullanarak bir emir açarken marjın tam değerini alırsam ne olur? Parti inşası - her zaman iki ondalık basamak içerecek, değil mi? Daha sonra 100 ile çarpacağım ve bu sıralamanın MagicNumber'ı olarak kaydedeceğim. Ve gerekirse oradan alıp 100.0'a böleceğim.

doğru olacak mı?

 
Babu Bonappan :

Ancak, MarketInfo'yu ( OrderSymbol (), MODE_MARGINREQUIRED )* kullanarak bir emir açarken marjın tam değerini alırsam ne olur? Parti inşası - her zaman iki ondalık basamak içerecek, değil mi? Daha sonra 100 ile çarpacağım ve bu sıralamanın MagicNumber'ı olarak kaydedeceğim. Ve gerekirse oradan alıp 100.0'a böleceğim.

doğru olacak mı?

Yine, sihirbaz bunun için değil. Günlük dosyasına yazmak ve ardından okumak daha iyidir.

Her şey, böyle bir hesaplamanın yapılma amacına, programın kaç sipariş için tasarlandığına bağlıdır.

Bana öyle geliyor ki sadece bir komisyoncu veya DC'nin bu kadar doğru hesaplamalara ihtiyacı var.

Bu açıdan bakıldığında, günlük kaydı hala en iyi çözümdür.

 
Vitaly Muzichenko :

Karakter sayısı konusunda neden yalan söylüyorsun? İnsanları yanıltmayın.

Ha.

Doğruluğu arttırılmış hesapları hiç duydunuz mu?

 

Etkilenmiş:

basit bir Uzman Danışman yazacaktım ama bir sorun vardı.

Partinin yarısını kapatmak doğru çalışmıyor ve her tik için sıra değiştiriliyor.

İşte satın alma değişiklik bloğu

if (CountBuy()>0) //Bu fonksiyon alış emirlerinin sayısını sayar
{ for (int i = OrdersTotal() -1; i>=0; i--)
{ if (Sipariş Seçimi(i,SELECT_BY_POS,MODE_TRADES))
{ if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Fiyat indikatörden gerekli hareketi geçtiyse
SL=NormalizeÇift(Ask-(MinMove*10)*Puan,Rakamlar); // Burada durağı başabaş olarak değiştiriyorum
if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Partinin yarısı kapatılmaya çalışılıyor
Print("Satın alınan partinin yarısı kapatılırken hata oluştu");
if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Gerisini burada başabaş olacak şekilde yeniden düzenleyin
Print("Satın almak için başabaş değiştirilirken hata oluştu");

} } }


 
Vladimir Karputov :

Etkilenmiş:

Vasiliy Danilov , 2016.12.02 07:18

İlk önce Lot/2 yerine NormalizeDouble (OrderLot()/2,2) kullanmayı deneyin

Ve okunabilir hale getirmek için kodu "SRC" düğmesi aracılığıyla gönderiye yapıştırın

 
Lütfen bana çözemediğimi söyle. Neredeyse harici bir gösterge üzerine basit bir Uzman Danışman yazacaktım ama bir sorun vardı.

Blokta bir OrederClose varsa, partinin yarısı hemen kapatılır ve ardından OrderModify artık çalışmaz.

OrederClose'u kaldırırsanız, OrderModify her onay için sırayı değiştirir

İşte satın alma değişiklik bloğu

   if (CountBuy()> 0 ) //В этой функции считается кол-во ордеров на покупку
   { for ( int i = OrdersTotal () - 1 ; i>= 0 ; i--)
     { if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
      {   if ( OrderMagicNumber ()==Magic && OrderType ()== OP_BUY && ( Ask - OrderOpenPrice ())* 10000 >MinMove) //Если цена прошла необходимое движение из индикатора
      SL= NormalizeDouble ( Ask -(MinMove* 10 )* Point , Digits ); //Тут меняю стоп на безубыток
       if (! OrderClose (Ticket,Lots/ 2 , Ask ,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print ( "Ошибка закрытия половины лота на покупку" );
       if (! OrderModify (Ticket, OrderOpenPrice (),SL,TP, 0 )) //Тут переставляю оставшуюся часть в безубыток
       Print ( "Ошибка модификации в безубыток на покупку" );

   }    }   }
Fiyat MinMove'a geçtiğinde emrin yarısının kapanmasını ve ikinci yarısının bir kez başabaşa dönmesini nasıl sağlayabilirim?
 
Vasiliy Danilov :
Lütfen bana çözemediğimi söyle. Neredeyse harici bir gösterge üzerine basit bir Uzman Danışman yazacaktım ama bir sorun vardı.

Blokta bir OrederClose varsa, partinin yarısı hemen kapatılır ve ardından OrderModify artık çalışmaz.

OrederClose'u kaldırırsanız, OrderModify her onay için sırayı değiştirir

İşte satın alma değişiklik bloğu

   if (CountBuy()> 0 ) //В этой функции считается кол-во ордеров на покупку
   { for ( int i = OrdersTotal () - 1 ; i>= 0 ; i--)
     { if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
      {   if ( OrderMagicNumber ()==Magic && OrderType ()== OP_BUY && ( Ask - OrderOpenPrice ())* 10000 >MinMove) //Если цена прошла необходимое движение из индикатора
      SL= NormalizeDouble ( Ask -(MinMove* 10 )* Point , Digits ); //Тут меняю стоп на безубыток
       if (! OrderClose (Ticket,Lots/ 2 , Ask ,Slippage,Black)) //Пытаюсь закрыть половину лота
       Print ( "Ошибка закрытия половины лота на покупку" );
       if (! OrderModify (Ticket, OrderOpenPrice (),SL,TP, 0 )) //Тут переставляю оставшуюся часть в безубыток
       Print ( "Ошибка модификации в безубыток на покупку" );

   }    }   }
Fiyat MinMove'a geçtiğinde emrin yarısının kapanmasını ve ikinci yarısının bir kez başabaşa dönmesini nasıl sağlayabilirim?

Partinin yarısını kapatırken yanlışlıkla çarpıyorsunuz, bu nedenle değiştirilmiyor. Lütfen yukarıdaki mesajıma göre düzeltin.

Ve bunu bir kez yapmak için, başabaş noktasını sabit sayıda puana ayarlamanız ve bu sayının eşleştiği gerçeği için siparişin kârını kontrol etmek için bir koşul eklemeniz gerekir.

Ve sipariş değiştirme bloğunda böyle bir koşuldan geçerken, yarıyı kapatın

 
Alexey Kozitsyn :
Numara. Ne yaptığınızı anlamaya çalışın. Yazdıklarınız sadece bir fonksiyon prototipidir (yani, sadece açıklaması, ne yaptığı). Onlar. az önce belgelerden bir parça koparttım. Kullanmanız gerekiyor. Onlar. argümanlar için kendi değerlerinizi değiştirin. Ve fonksiyon sonucu size döndürecektir. Ayrıca, bu sonucun işlenmesi gerekir.

Cevap için teşekkürler ... İnternetin zeminini kürekledim, StringFind işlevini kullanmanın çok az örneği var, bulduklarımdan parametrelerin olması gerektiği sonucuna vardım:

int StringFind (

    sicim    yorum = SiparişYorum ()   // içinde aradığımız string
    sicim    OrderStopLoss , OrderTakeProfit // ne arıyoruz
    int        start_pos=0     // aramayı başlatmak için hangi konumdan

);

...yanılıyorsam lütfen düzeltin...

 
Vitaly Muzichenko :

Karakter sayısı konusunda neden yalan söylüyorsun? İnsanları yanıltmayın.

tüm brokerlerin farklı bir noktası vardır
Neden: