İşlemleri filtrelemeniz gerekir. if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)== true ) if (OrderSymbol()== Symbol ()) if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001 ) PointValue = 0.0001 ; // These else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001 ) PointValue = 0.01 ;// four else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001 ) PointValue = 0.01 ; // lines else PointValue = MarketInfo(OrderSymbol(), MODE_POINT); // Execute only on Symbol orders . double lots = NormalizeDouble (OrderLots() * Multiplier, 2 ); // This and below are always executed if (OrderType() == OP_BUY) // Symbol is irrelevant.
Parantez ile. if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)== true ) if (OrderSymbol()== Symbol ()) { // Rest of code executes only on Symbol orders. if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001 ) PointValue = 0.0001 ; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001 ) PointValue = 0.01 ; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001 ) PointValue = 0.01 ; else PointValue = MarketInfo(OrderSymbol(), MODE_POINT); double lots = NormalizeDouble (OrderLots() * Multiplier, 2 ); if (OrderType() == OP_BUY) : }
4 basamaklı bir komisyoncuda nokta = 0.0001 if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001 ) PointValue = 0.0001 ; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001 ) PointValue = 0.01 ; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001 ) PointValue = 0.01 ; else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
Sabit ve basitleştirilmiş. PointValue = MarketInfo(OrderSymbol(), MODE_POINT); if (MarketInfo(OrderSymbol(), MODE_DIGITS) % 2 = 1 ) PointValue *= 10 ;
- Parantez içindeki her şey Symbol() olduğundan, her MarketInfo önceden tanımlanmış değişkenlerle değiştirilebilir
Kod numaralarını sabit tutmayın. Dönüş kodlarınızı kontrol edin Fonksiyon dönüş değerleri nelerdir? Onları nasıl kullanırım? - MQL4 forumu ve MQL4 Programlarında Sık Karşılaşılan Hatalar ve Bunların Önlenmesi - MQL4 Makaleleri | result= OrderSend ( Symbol (), OP_BUY, 0.01 , Ask, 3 , Ask - StopLoss* 0.0001 , 0 , "Original" , magicNumber, 0 , Blue); |
1. Yardımınız için çok teşekkür ederim. Önerildiği gibi bir parantez ekledim, ancak EA hala sadece bir döviz çiftinde bir ticaret açıyor. Satın alma koşulu karşılanmış olsa bile, diğer grafiklerde herhangi bir işlem açmayacaktır. Haftalardır buna takıldım, lütfen bir daha bakar mısın?
2. EDIT: Artık gerekli değil
3. Kodum şimdi şöyle görünüyor
int start() { { if ( OrdersTotal () == 0 ) if (Close[ 1 ]>Close[ 2 ]) result= OrderSend ( Symbol (), OP_BUY, 0.01 , Ask, 3 , Ask - StopLoss* Point * 10 , 0 , "Original" , magicNumber, 0 , Blue); Print ( "Error setting Original order: " , GetLastError ()); } for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) { //calculate new lotsize of hedge based on lotsize of current open trade*Multiplier double lots = NormalizeDouble (OrderLots() * Multiplier, 2 ); if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)== true ) if (OrderSymbol()== Symbol ()) { if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble (TrailingStart * Point * 10 , Digits )) { if (OrderStopLoss() < Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits )) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ), OrderTakeProfit(), Blue)) Print ( "Error setting Buy trailing stop: " , GetLastError ()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble (Hedge* Point * 10 , Digits )) if ( OrdersTotal () == 1 ) result= OrderSend ( Symbol (), OP_SELL, lots, Bid, 3 , Bid + Stoploss* Point * 10 , 0 , "Hedge" , 0 , 0 , Blue); Print ( "Error setting Sell Hedge: " , GetLastError ()); }
if ( OrdersTotal () == 0 ) if (Close[ 1 ]>Close[ 2 ]) result= OrderSend ( Symbol (), OP_BUY, 0.01 , Ask, 3 , Ask - StopLoss*PointValue, 0 , "Original" , magicNumber, 0 , Blue); Print ( "Error setting Original order: " , GetLastError ());Herhangi bir çiftte bir emir açıksa, tekrar OrdersTotal()==0 olana kadar başka bir emir açmayacaktır.
Herhangi bir çiftte bir emir açıksa, tekrar OrdersTotal()==0 olana kadar başka bir emir açmayacaktır.
Yardımın için teşekkürler. İlk orijinal siparişi yalnızca bir işlemle sınırlamam gerekiyor. Satın alma koşulu karşılandığında EA'nın siparişleri açmaya devam etmesini istemiyorum. Bu yüzden bunu sınırlamak için Orderstotal'ı ekledim. Ancak bu kod, buradaki koda müdahale ediyor gibi görünüyor
else if (OrderOpenPrice() > Bid + NormalizeDouble (Hedge* Point * 10 , Digits )) if ( OrdersTotal () == 1 ) //<---------- result= OrderSend ( Symbol (), OP_SELL, lots, Bid, 3 , Bid + Stoploss* Point * 10 , 0 , "Hedge" , 0 , 0 , Blue); Print ( "Error setting Sell Hedge: " , GetLastError ());
Burada EA'nın açık ticaret başına yalnızca bir hedge açmasını istiyorum, dolayısıyla OrderTotal ==1
Öyleyse, alım satım sayısını sınırlamanın en iyi yolu nedir, yani bir orijinal alım satım ve bir hedge alım satımı? Teşekkür ederim
Trader3000 : Öyleyse, işlem sayısını sınırlamanın en iyi yolu nedir, yani bir orijinal işlem ve bir hedge işlemi? |
|
Herkesin yardımları için çok teşekkür ederim. Sorunu çözdüm ve EA şimdi satın alma koşulu karşılandığında tüm grafiklerde bir ticaret açacak, ancak bunun altındaki hiçbir şey çalışmıyor. EA, Trailingstop veya Hedge işlevlerini çağırmıyor. Birisi lütfen bir göz atıp neyi yanlış yaptığımı bana bildirin çünkü çözemiyorum.
int start() { double Lots = NormalizeDouble (AccountEquity()*Percentage*Lotsize/ 100 , 2 ); double lots = NormalizeDouble (OrderLots() * Multiplier, 2 ); total= 0 ; for (i = OrdersTotal ()- 1 ; i >= 0 ; i--) if ( OrderSelect (i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol ()) { total++; } { if (total== 0 ) if (Close[ 1 ]>Close[ 2 ]) { result= OrderSend ( Symbol (), OP_BUY, Lots, Ask, 3 , Ask - StopLoss* Point * 10 , 0 , "Original" , magicNumber, 0 , Blue); Print ( "Error setting Original order: " , GetLastError ()); } if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble (TrailingStart * Point * 10 , Digits )) { if (OrderStopLoss() < Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits )) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ), OrderTakeProfit(), Blue)) Print ( "Error setting Buy trailing stop: " , GetLastError ()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble (Hedge* Point * 10 , Digits )) if (total == 1 ) result= OrderSend ( Symbol (), OP_SELL, lots, Bid, 3 , Bid + Stoploss* Point * 10 , 0 , "Hedge" , magicNumber, 0 , Blue); Print ( "Error setting Sell Hedge: " , GetLastError ()); }
double Lots = NormalizeDouble (AccountEquity()*Percentage*Lotsize/ 100 , 2 ); double lots = NormalizeDouble ( OrderLots() * Multiplier, 2 );
Ne yaptığınızı tam olarak bilmiyorum, ancak tek fark büyük harf olmak üzere 2 değişkeni adlandırmaktan kaçınmanızı öneririm. Özellikle kodunuzu okuyan diğer kişiler büyük harfle başlayan değişkenlerin Globalscope olduğu kuralını benimsemişse, 2'yi karıştırmak kolaydır.
Hiçbir sipariş seçilmedi, bu nedenle OrderLots() herhangi bir şey olabilir
if (OrderType() == OP_BUY)
Bu, önceki döngüde seçilen son sıradaki değerleri kullanır, doğru sihirli sayı veya sembol olmayabilir.
Cevabın için teşekkürler. Yapmaya çalıştığım şey, lot büyüklüğünün öz sermayemin bir yüzdesi olduğu ilk orijinal ticareti EA'nın açmasını sağlamak. Ticaret ters giderse
Bana göre, EA ters yönde bir hedge açmalıdır, ancak burada lot boyutu, orijinal lot boyutunun (OrderLots) 3 katı olmalıdır. Yokmuş gibi görünse de
sipariş seçildi, işlemi etkilemedi. Şimdi Lotları doğrudan OrderSend işlevine yerleştirdim, ancak ne sondaki durdurma ne de
hedge, gerektiğinde tetiklenir. Her ikisi de bunu eklemeden önce mükemmel çalıştı
total= 0 ; for (i = OrdersTotal ()- 1 ; i >= 0 ; i--) if ( OrderSelect (i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol ()) { total++; }
int start() { double Lots = NormalizeDouble (AccountEquity()*Percentage*Lotsize/ 100 , 2 ); total= 0 ; for (i = OrdersTotal ()- 1 ; i >= 0 ; i--) if ( OrderSelect (i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol ()) { total++; } { if (total== 0 ) if (Close[ 1 ]>Close[ 2 ]) result= OrderSend ( Symbol (), OP_BUY, Lots, Ask, 3 , Ask - StopLoss* Point * 10 , 0 , "Original" , magicNumber, 0 , Blue); Print ( "Error setting Original order: " , GetLastError ()); } { if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble (TrailingStart * Point * 10 , Digits )) { if (OrderStopLoss() < Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits )) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ), OrderTakeProfit(), Blue)) Print ( "Error setting Buy trailing stop: " , GetLastError ()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble (Hedge* Point * 10 , Digits )) if (total == 1 ) result= OrderSend ( Symbol (), OP_SELL, NormalizeDouble (OrderLots() * Multiplier, 2 ), Bid, 3 , Bid + Stoploss* Point * 10 , 0 , "Hedge" , magicNumber, 0 , Blue); Print ( "Error setting Sell Hedge: " , GetLastError ()); }
{} diş tellerimin doğru yerlerde olmadığına inanıyorum
Şimdiye kadarki tüm yardımlar için çok teşekkür ederim. ilerleme kaydediyorum. Şimdi buna sahibim, böylece EA'nın bir hedge ticareti açma koşulunu görmezden gelmesi dışında her şey olması gerektiği gibi çalışıyor gibi görünüyor. Koşullar karşılanmadığında bile bazen (ancak her zaman değil) bir riskten korunma işlemi açar. Ayrıca TrailingStop her zaman devreye girmiyor. Sanırım hala bir yerde {} parantezlerini kaçırıyorum. Kodum şimdi şöyle görünüyor. Lütfen biri bana bakabilir mi? Teşekkür ederim.
int start() { total= 0 ; for (i = OrdersTotal ()- 1 ; i >= 0 ; i--) if ( OrderSelect (i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol ()) { total++; } { if (total== 0 ) if (Close[ 1 ]>Close[ 2 ]) { result= OrderSend ( Symbol (), OP_BUY, 0.01 , Ask, 3 , Ask - StopLoss* Point * 10 , 0 , "Original" , magicNumber, 0 , Blue); Print ( "Error setting Original order: " , GetLastError ()); } if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble (TrailingStart * Point * 10 , Digits )) { if (OrderStopLoss() < Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits )) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble (TrailingStop * Point * 10 , Digits ), OrderTakeProfit(), Blue)) Print ( "Error setting Buy trailing stop: " , GetLastError ()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble (Hedge* Point * 10 , Digits )) //<------- THIS IS BEING IGNORED SOMETIMES (I THINK) if (total == 1 ) { result= OrderSend ( Symbol (), OP_SELL, NormalizeDouble (OrderLots() * Multiplier, 2 ), Bid, 3 , Bid + Stoploss* Point * 10 , 0 , "Hedge" , magicNumber, 0 , Blue); Print ( "Error setting Sell Hedge: " , GetLastError ()); } } // else if (OrderType() == OP_SELL) // ...
GumRai :
This would use the values from the last order selected in the previous loop, it may not be the correct magic number or symbol.

- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Herkese selam. Bu forumda bulabildiğim her türlü tavsiyeyi denedim ama hiçbiri işe yaramıyor. Birisi lütfen yardım eder mi? Sorunun OrderTotal işlevimden kaynaklandığına inanıyorum. 10 döviz çifti ticareti yapıyorum, yani EA'm 10 grafikte açık. Bu basit bir riskten korunma stratejisidir. EA'nın sinyallere bağlı olarak bir ticaret (uzun veya kısa) açmasını istiyorum. Ticaret benim yoluma giderse, Trailingstop veya Kar al. Ancak, işlem bana karşı çıkarsa, ters yönde bir işlem açmasını istiyorum. Kullandığım kod çalışıyor gibi görünüyor ama bazen takılıyor, yani artık herhangi bir işlem açmıyor. Ayrıca, bir çiftte bir veya iki işlem açık olduğunda, diğer çiftlerde herhangi bir işlem açmak istemiyor gibi görünüyor.
İşte kodum