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

 
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ı?

Her siparişe kendi sihrinizi atamak ister misiniz?
 
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.

OrderOpenPrice - sipariş açılış fiyatı, o (fiyat) bir para biriminin diğerine oranıdır

AccountMargin - tüm açık emirler için toplam hesap marjını verir.

 
Vladimir Karputov :

Etkilenmiş:

Vasiliy Danilov , 2016.12.02 07:18

Lütfen bana çözemediğimi söyle. Neredeyse harici bir gösterge üzerine 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");

} } }


Siparişin her tıklamada değiştirilmemesi için, if (SL != OrderStopLoss ()) change ... gibi bir şeyi kontrol edebilirsiniz. O zaman sadece SL değeri mevcut OrderStopLoss'tan farklıysa değiştirilir.

ve kapatırken neyin yanlış olduğunu anlamak için bir GetLastError () isteği koyun; ama genel olarak OrderClose'u kontrol etmek güzel olurdu ... bool testOrCls

testOrCls=SiparişKapat ......

if(! testOrCls) Yazdır ( GetLastError () );

onlar. hata varsa hata kodunu soruyoruz, hata yoksa hata kodunu istemiyoruz.


 
bablusut :

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...

Bu şekilde biraz çalışmıyor. Bu işlevin bağımsız değişkenleri olarak belirtilir 1) içinde aranacak dize; 2) bulunacak karakterlerin kombinasyonu; 3) Arama başlangıcı (varsayılan olarak - madde 1'e göre dizenin boş karakterinden).

Aranan alt dizenin başladığı dizedeki konum numarasını veya alt dize bulunamazsa -1 döndürür.

Yani, şöyle yazmanız gerekir:

if ( StringFind ( OrderComment (), "[tp]" , 0 )>- 1 ) {действие при нахождении признака закрытия по TP}
 
Renat Akhtyamov :

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ı alma durumunu 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

Vasili 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?

Bu arada, şimdi SELECT_BY_POS konumuna göre OrderSelect'i fark ettim, ancak bilet seçimi nerede?

SiparişKapat(SiparişTicket()

 
Babu Bonappan :

Lütfen bana MQL4 kullanarak terminaldeki her açık pozisyon için marjı nasıl alacağımı söyleyin?

Genelde bunu yapardım:

margin = MarketInfo ( Symbol (), MODE_LOTSIZE ) * OrderOpenPrice () / AccountLeverage () * OrderLots ();

EUR/USD ticareti yaparken bu yapı mükemmel çalıştı ve mantığının doğru olduğundan emindim.

Ama şimdi EUR/JPY (veya EUR/CHF) için aynı sonucu almak istiyorum. Açıkçası, OrderOpenPrice () yerine, standart lotun boyutunu temel para biriminin mevduat para birimine olan döviz kuruyla (benim durumumda EUR/USD ile) çarpmam gerekiyor. Ama bu kurs nedir? Bir pozisyon açma anında olan mı yoksa şu anda olan mı (bu pozisyon için marj miktarını bilmek istediğimiz anda)?

MODE_MARGINMAINTENANCE hayır?

 
A1exPit :

Bu arada, şimdi SELECT_BY_POS konumuna göre OrderSelect'i fark ettim, ancak bilet seçimi nerede?

SiparişKapat(SiparişTicket()

Bu konu hakkında gerçekten hiçbir şey bilmiyor musun?

Bir sipariş seçilirse, OrderTicket() seçilen siparişin biletini döndürür. Ve sıranın nasıl seçildiği önemli değil - endeks veya bilete göre.

Biletle seçim yaparken bir nüans var - havuz dikkate alınmaz ve kapanış saatini kontrol ederek siparişin hangi listeden seçildiğini kontrol etmeniz gerekir.

 
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?

Kısmi kapatma ile bilet değişir. Önce başabaş, sonra kapanış.

Veya mantığı değiştirin.

 
Artyom Trishkin :

A1exPit :

Bu arada, şimdi SELECT_BY_POS konumuna göre OrderSelect'i fark ettim, ancak bilet seçimi nerede?

SiparişKapat(SiparişTicket()

Bu konu hakkında gerçekten hiçbir şey bilmiyor musun?

Bir sipariş seçilirse, OrderTicket()seçilen siparişin biletini döndürür. Ve sıranın nasıl seçildiği önemli değil - endeks veya bilete göre.

Biletle seçim yaparken bir nüans var - havuz dikkate alınmaz ve kapanış saatini kontrol ederek siparişin hangi listeden seçildiğini kontrol etmeniz gerekir.

Ve bu yorumun yazıldığı koda bakarsanız? O kadar net değil...

{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
 
Vitalie Postolache :

Ve bu yorumun yazıldığı koda bakarsanız? O kadar net değil...

{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
Şey... evet... Dikkatli bakmadım. Evet biraz. Nedense bu başlıkla ilgilenmiyorum.