Sonunda konuyu buldum https://www.mql5.com/en/forum/14327
sadece o konuyu bulmam 2 saatimi aldı... Neyse EA yeterince uzun süre uyumuyor değil, bu yüzden çift giriş yapıyor?
Aynı sorunu yaşayan ve xxxx kullanan birini hatırlıyorum.
Konuyu bulamadım, yardımcı olabilecek biri varsa çok teşekkur ederim.
On_Tick() içinde aşağıdaki gibi kodlarım
0.01 lot girilmeli, bunun yerine 0.02 lot girilmelidir.
dergiden
2013.12.20 08:35:01 ticaret '800****': anlaşma #27731692, 1.36354'ten 0.01 EURUSD satın aldı ( sipariş #40018327)
2013.12.20 08:35:01 ticaret '800****': 331 ms'de yürütme için yerleştirilen piyasada 0,01 EURUSD döviz alımı
2013.12.20 08:35:01 ticaret '800****': anlaşma #27731691, 1.36353'ten 0.01 EURUSD satın alın (#40018326 numaralı siparişe göre)
2013.12.20 08:35:00 ticaret '800****': borsada 0,01 EURUSD satın al
2013.12.20 08:35:00 ticaret '800****': 313 ms'de yürütme için yerleştirilen piyasada 0,01 EURUSD döviz alımı
2013.12.20 08:35:00 ticaret '800****': borsada 0,01 EURUSD satın al
- Bu, gönderdiğiniz kodun günlüğü değil (Yazdır ifadesinin sonuçları nerede?).
- Neden Sleep() kullanmanız gerekiyor? Bu gereksiz.
- Neden bir döngüye ihtiyacınız var? Hatanın nedenini bile kontrol etmiyorsunuz ve bu yüzden düzeltmiyorsunuz.
- ResultRetcode() ve/veya GetLastError()'u kontrol etmeniz gerekir, (yalnızca) ResultComment()'i değil.
- Bu, gönderdiğiniz kodun günlüğü değil (Yazdır ifadesinin sonuçları nerede?).
Uzman sekmesi altında, EURUSD'de açılan Pozisyon dışında print ekstresinden çıktı yoktur.
- Neden Sleep() kullanmanız gerekiyor? Bu gereksiz.
- ResultRetcode() ve/veya GetLastError()'u kontrol etmeniz gerekir, (yalnızca) ResultComment()'i değil.
bunları okuyacağım
Ancak if (! PositionSelect ( Symbol ())) ile
neden hala 2 kez yürütülüyor?
- Bu, gönderdiğiniz kodun günlüğü değil (Yazdır ifadesinin sonuçları nerede?).
Uzman sekmesi altında, EURUSD'de açılan Pozisyon dışında print ekstresinden çıktı yoktur.
- Neden Sleep() kullanmanız gerekiyor? Bu gereksiz.
diğer iş parçacığı uyku kullanarak çözüyor gibi görünüyor
- ResultRetcode() ve/veya GetLastError()'u kontrol etmeniz gerekir, (yalnızca) ResultComment()'i değil.
bunları okuyacağım
Ancak if (! PositionSelect ( Symbol ())) ile
neden hala 2 kez yürütülüyor?
Evet, 2 kez yazdırıldı > EURUSD'de açılan pozisyon
Başka bir kullanıcı tarafından bildirilen aynı sorun > https://www.mql5.com/en/forum/14327
350ms ile uyku kullanılarak çözüldü
EA'm bundan önce 2 işlem daha yaptı ve gayet iyi.
EA'm siparişi işlemeyi çoktan bitirmişse ve komisyoncu henüz ticari ayrıntıları bana geri vermemişse ve EA'm 2 girişe neden olan yeni bir onay onaylamış mı diye düşünüyorum.
Evet, 2 kez yazdırıldı > EURUSD'de açılan pozisyon
Başka bir kullanıcı tarafından bildirilen aynı sorun > https://www.mql5.com/en/forum/14327
350ms ile uyku kullanılarak çözüldü
EA'm bundan önce 2 işlem daha yaptı ve gayet iyi.
EA'm siparişi işlemeyi çoktan bitirmişse ve komisyoncu henüz ticari ayrıntıları bana geri vermemişse ve EA'm 2 girişe neden olan yeni bir onay onaylamış mı diye düşünüyorum.
Bu olası bir açıklama gibi görünüyor, ancak durum buysa normal değil. Asenkron mod mu kullanıyorsunuz? Değilse, EA'nız sunucunun yanıtını beklemeli ve ardından yalnızca devam etmeli ve bir sonraki onay işaretini işlemelidir.
İyi anlarsam, bu rastgele bir sorundur ve yeniden üretemez misiniz?
m_Trade beyanından sonra bu satırı ekleyerek daha fazla hata ayıklama bilgisi yazdırmayı deneyebilirsiniz:
m_Trade.LogLevel(LOG_LEVEL_ALL);
Bu olası bir açıklama gibi görünüyor, ancak durum buysa normal değil. Asenkron mod mu kullanıyorsunuz? Değilse, EA'nız sunucunun yanıtını beklemeli ve ardından yalnızca devam etmeli ve bir sonraki onay işaretini işlemelidir.
İyi anlarsam, bu rastgele bir sorundur ve yeniden üretemez misiniz?
m_Trade beyanından sonra bu satırı ekleyerek daha fazla hata ayıklama bilgisi yazdırmayı deneyebilirsiniz:
cTrade sınıfını kullanıyorum. Asenkron mod varsayılan olarak açık mı?
bunu kullanmamı önerir misiniz m_Trade.SetAsyncMode(false);
Bunu on_init() içine ayarlamalı mıyım?
cTrade sınıfını kullanıyorum. Asenkron mod varsayılan olarak açık mı?
bunu kullanmamı önerir misiniz m_Trade.SetAsyncMode(false);
Bunu on_init() içine ayarlamalı mıyım?
Normalde varsayılan olarak yanlıştır. Ve kullandığınız kodla birlikte false olmalıdır.
Rapor ettiğiniz şey "ilginç", bence bu normal bir davranış değil ve bir yerlerde bir hata var gibi görünüyor. Hatayı yeniden oluşturmak için bir örnek kod gönderme olanağınız var mı? Her durumda, bu konuyu araştıracağım.
- www.mql5.com
Araştırma yardımınız için teşekkürler, EA'mı geliştirmek için kullandığım şablonumu ekleyeceğim. Sleep() daha önce 100ms'deydi, başka bir kullanıcı tarafından başlatılan iş parçacığını okuduktan sonra 800 olarak güncelledim.
//+------------------------------------------------------------------+ //| Template.mq5 | //| doshur | //| http://tradeaud.blogspot.com | //+------------------------------------------------------------------+ #property copyright "doshur" #property link "http://tradeaud.blogspot.com" #property version "1.00" #include <Trade\Trade.mqh> #define ErrCnt 5 //--- Input Parameters input int TP = 50 ; input int SL = 40 ; input double LotSize = 0.01 ; //--- Buffers double MA_Fast[]; double MA_Slow[]; //--- Handles int h_MA_Fast; int h_MA_Slow; //--- Globals double AdjPoints; CTrade m_Trade; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit () { //--- h_MA_Fast = iDEMA ( Symbol (), 0 , 3 , 0 , PRICE_CLOSE ); h_MA_Slow = iDEMA ( Symbol (), 0 , 5 , 0 , PRICE_CLOSE ); //--- long SymDigits; double SymPoints; SymPoints = SymbolInfoDouble ( Symbol (), SYMBOL_POINT ); SymDigits = SymbolInfoInteger ( Symbol (), SYMBOL_DIGITS ); if (SymDigits == 3 || SymDigits == 5 ) { AdjPoints = SymPoints * 10 ; } else { AdjPoints = SymPoints; } //--- return ( INIT_SUCCEEDED ); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit ( const int reason) { //--- IndicatorRelease (h_MA_Fast); IndicatorRelease (h_MA_Slow); //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick () { //--- if (!CopyBufferAsSeries(h_MA_Fast, 0 , 0 , 3 , true , MA_Fast)) return ; if (!CopyBufferAsSeries(h_MA_Slow, 0 , 0 , 3 , true , MA_Slow)) return ; //--- double Price; ulong SymSpread; int ErrorCount; ErrorCount = 0 ; SymSpread = SymbolInfoInteger ( Symbol (), SYMBOL_SPREAD ); m_Trade.SetDeviationInPoints(SymSpread); MqlDateTime sTime; TimeCurrent (sTime); //--- if (! PositionSelect ( Symbol ())) if (TradeCount( PERIOD_CURRENT ) == 0 ) { // Open BUY Position if (MA_Fast[ 0 ] > MA_Slow[ 0 ] && MA_Fast[ 1 ] < MA_Slow[ 1 ]) { // { do { Price = SymbolInfoDouble ( Symbol (), SYMBOL_ASK ); if (m_Trade.PositionOpen( Symbol (), ORDER_TYPE_BUY , LotSize, Price, 0 , 0 )) { Print ( "Position opened in " , Symbol ()); Sleep ( 800 ); break ; } else { ErrorCount++; Print ( "Error opening BUY position in " , Symbol (), " - " , m_Trade.ResultComment(), "\n" , "Return Code Desc - " , m_Trade.ResultRetcodeDescription()); } if (ErrorCount == ErrCnt) { Print ( "Error count = " , ErrCnt); } } while (ErrorCount < ErrCnt); } } // Open SELL Position if (MA_Fast[ 0 ] < MA_Slow[ 0 ] && MA_Fast[ 1 ] > MA_Slow[ 1 ]) { // { do { Price = SymbolInfoDouble ( Symbol (), SYMBOL_BID ); if (m_Trade.PositionOpen( Symbol (), ORDER_TYPE_SELL , LotSize, Price, 0 , 0 )) { Print ( "Position opened in " , Symbol ()); Sleep ( 800 ); break ; } else { ErrorCount++; Print ( "Error opening SELL position in " , Symbol (), " - " , m_Trade.ResultComment(), "\n" , "Return Code Desc - " , m_Trade.ResultRetcodeDescription()); } if (ErrorCount == ErrCnt) { Print ( "Error count = " , ErrCnt); } } while (ErrorCount < ErrCnt); } } } //--- long Pos_OT, Pos_HT; double Pos_OP; if ( PositionSelect ( Symbol ())) { Pos_OT = PositionGetInteger ( POSITION_TIME ); Pos_HT = TimeCurrent () - Pos_OT; Pos_OP = PositionGetDouble ( POSITION_PRICE_OPEN ); Price = PositionGetDouble ( POSITION_PRICE_CURRENT ); if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY ) { // Take Profit if (Price - Pos_OP >= TP * AdjPoints) { m_Trade.PositionClose( Symbol (), SymSpread); Sleep ( 800 ); } // Stop Loss if (Pos_OP - Price >= SL * AdjPoints) { m_Trade.PositionClose( Symbol (), SymSpread); Sleep ( 800 ); } } if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL ) { // Take Profit if (Pos_OP - Price >= TP * AdjPoints) { m_Trade.PositionClose( Symbol (), SymSpread); Sleep ( 800 ); } // Stop Loss if (Price - Pos_OP >= SL * AdjPoints) { m_Trade.PositionClose( Symbol (), SymSpread); Sleep ( 800 ); } } } //--- } //+------------------------------------------------------------------+ //| Tester function | //+------------------------------------------------------------------+ double OnTester () { //--- //--- } //+------------------------------------------------------------------+ //| Copy Buffer As Series | //+------------------------------------------------------------------+ bool CopyBufferAsSeries( int handle, int buffer, int start, int number, bool asSeries, double &M[]) { //--- if ( CopyBuffer (handle, buffer, start, number, M) <= 0 ) return ( false ); ArraySetAsSeries (M, asSeries); return ( true ); //--- } //+------------------------------------------------------------------+ //| Trade Count | //+------------------------------------------------------------------+ int TradeCount( ENUM_TIMEFRAMES TimeFrame) { //--- int Cnt; ulong Ticket; long EntryType; datetime DT[ 1 ]; Cnt = 0 ; if ( CopyTime ( Symbol (), TimeFrame, 0 , 1 , DT) <= 0 ) { Cnt = - 1 ; } else { HistorySelect (DT[ 0 ], TimeCurrent ()); for ( int i = HistoryDealsTotal () - 1 ; i >= 0 ; i--) { Ticket = HistoryDealGetTicket (i); EntryType = HistoryDealGetInteger (Ticket, DEAL_ENTRY ); if (EntryType == DEAL_ENTRY_IN ) if ( Symbol () == HistoryDealGetString (Ticket, DEAL_SYMBOL )) { Cnt++; } } } //--- return (Cnt); }
- Ü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
Aynı sorunu yaşayan ve xxxx kullanan birini hatırlıyorum.
Konuyu bulamadım, yardımcı olabilecek biri varsa çok teşekkur ederim.
On_Tick() içinde aşağıdaki gibi kodlarım
0.01 lot girilmeli, bunun yerine 0.02 lot girilmelidir.
dergiden
2013.12.20 08:35:01 ticaret '800****': anlaşma #27731692, 1.36354'ten 0.01 EURUSD satın aldı ( sipariş #40018327)
2013.12.20 08:35:01 ticaret '800****': 331 ms'de yürütme için yerleştirilen piyasada 0,01 EURUSD döviz alımı
2013.12.20 08:35:01 ticaret '800****': anlaşma #27731691, 1.36353'ten 0.01 EURUSD satın alın (#40018326 numaralı siparişe göre)
2013.12.20 08:35:00 ticaret '800****': borsada 0,01 EURUSD satın al
2013.12.20 08:35:00 ticaret '800****': 313 ms'de yürütme için yerleştirilen piyasada 0,01 EURUSD döviz alımı
2013.12.20 08:35:00 ticaret '800****': borsada 0,01 EURUSD satın al