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

 
Kapizdo4ka :

Merhaba! Lütfen bana if esle ifadesinin neden bazen benim için çalışmadığını söyleyin.
İşte bir örnek:

Neresi:
H3, seviyenin fiyat değeridir
fiyat - cari fiyat

Sonuç olarak, fiyatın bu seviyeye ulaştığı ortaya çıkıyor (bazen bu seviyede duruyor), ancak Uyarı çalışmıyor.
Bana neyin yanlış olduğunu söyle?

Fiyatın nadiren seviyenin değeriyle tam olarak eşleşebilmesi gerçeği. Ya fiyat >= H3 ya da hata aralığını tanımlayın.
 
//+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                             http://vinin.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link        "http://vinin.ucoz.ru"
#property version    "1.00"
#property strict
// -------- переменные --- Н -----
extern double gLot= 0.1 ;             // размер лота для покупки 
extern double gPoint= 0.001 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
// -------- переменные --- К ----- 
int init()
  {
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {

// Открытие позиции
   if ( OrdersTotal ()== 0 )
     {
       Print ( " Открытие первой позиции " );
       double _Ask=MarketInfo( "GBPUSD" ,MODE_ASK);
       int ticket= OrderSend ( "GBPUSD" ,OP_BUY,gLot,_Ask, 15 , 0 , 0 );
       if (ticket> 0 )
        {
         Print ( " ОРДЕР ОТКРЫТ " ,ticket);
        }
     }

   double _Bid=MarketInfo( "GBPUSD" ,MODE_BID); //для цены
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos,SELECT_BY_POS))
        {
         if (OrderOpenPrice()+gPoint<_Bid)
           {
            OrderClose(OrderTicket(),OrderLots(),_Bid, 15 );
            
ResetLastError ();
if (!OrderClose(OrderTicket(),OrderLots(),_Bid, 15 )) Print ( "Чё-та не закрылася позиция. Фигня вот такая происходит: " + GetLastError ());

           }
        }
     }
   return ( 0 );
  }

Günaydın.

Program şuna benziyor.

Derlendiğinde şunları üretir:

'Ozero.mq4' Ozero.mq4 1 1
'OrderClose' dönüş değeri kontrol edilmelidir Ozero.mq4 46 13
'sayı'dan 'string'e örtük dönüştürme Ozero.mq4 49 117
0 hata(lar), 2 uyarı(lar) 1 3


"Sonuçlar" sekmesinde siparişlerin açılıp kapandığını görebilirsiniz.

1 2014.08.25 00:00 1 satın al 0.10 1.6550 0.0000 0.0000 0.00 10000.00
2 2014.08.25 06:30 Kapat 1 0.10 1.6562 0.0000 0.0000 0.12 10000.12
3 2014.08.25 06:31 2 satın al 0.10 1.6564 0.0000 0.0000 0.00 10000.12
4 2014.08.25 10:00 Kapanış 2 0.10 1.6574 0.0000 0.0000 0.10 10000.22
5 2014.08.25 10:00 3 satın al 0.10 1.6576 0.0000 0.0000 0.00 10000.22
6 2014.08.25 12:58 Kapat 3 0.10 1.6586 0.0000 0.0000 0.10 10000.32
7 2014.08.25 12:58 4 satın al 0.10 1.6590 0.0000 0.0000 0.00 10000.32
8 2014.08.26 13:13 Durakta 4 0.10 1.6576 0.0000 0.0000 -0.14 10000.18


8 - Test cihazını kapatarak çalışmayı yarıda kestim.


Ardından, "Günlük" e bakın:

2014.10.31 07:46:44.837 GBPUSD,M15: 312876 ms (toplam süre 324436 ms) içinde işlenen 4453 tick olayı (5608 bar, 340128 bar durumu)
2014.10.31 07:46:44.837 2014.08.26 13:13 Test eden: 4. sipariş kapalı
2014.10.31 07:46:44.798 2014.08.26 13:13 Görsel test cihazı durdu
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: SİPARİŞ AÇIK 4
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: açık #4 1.6590'dan 0.10 GBPUSD satın al tamam
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: İlk pozisyonun açılması
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: Pozisyon kapanmadı. Bu çöp oluyor: 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: OrderClose hatası 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: OrderClose işlevi için bilinmeyen bilet 3
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: Kapat #3 0.10 GBPUSD 1.6576'dan 1.6586 fiyattan satın alın
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: SİPARİŞ AÇIK 3
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: açık #3 1.6576'dan 0.10 GBPUSD satın al tamam
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: İlk pozisyonun açılması
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: Pozisyon kapanmadı. Bu çöp oluyor: 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: OrderClose hatası 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: OrderClose işlevi için bilinmeyen bilet 2
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: 2'yi kapat 0.10 GBPUSD'yi 1.6564'ten 1.6574'ten al
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: SİPARİŞ AÇIK 2
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: #2 açık 1.6564'te 0.10 GBPUSD al
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: İlk pozisyonun açılması
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: Pozisyon kapanmadı. Bu çöp oluyor: 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: OrderClose hatası 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: OrderClose işlevi için bilinmeyen bilet 1
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: kapanış #1 0.10 GBPUSD 1.6550'den 1.6562 fiyatından satın alın
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: SİPARİŞ AÇIK 1
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: açık #1 1.6550'de 0.10 GBPUSD satın al tamam
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: İlk pozisyonun açılması
2014.10.31 07:41:31.958 Ozero girişleri: gLot=0.1; gNoktası=0,001;

Şimdi tamamen kafam karıştı. Bir yandan, siparişler kapalıdır, bu tablodan ve "sonuçlardan" görülebilir, diğer yandan, günlüğe bakılırsa, kod hatalarla yürütülür: ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((

Göl.

 
Aynı siparişi iki kez kapatmaya çalışıyorsunuz. Üstü çıkarın.
 
Roger :
Aynı siparişi iki kez kapatmaya çalışıyorsunuz. Üstü çıkarın.
Alttaki daha iyi. Önce sipariş seçilmelidir.
 
            
//ResetLastError();
//if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());

Günaydın.

İki satır kaldırıldı. Her şey çalışıyor. Ve her şey hem sonuçlarda hem de günlüklerde grafikte doğru bir şekilde görüntüleniyor.

Soru: Derlerken verir


'Ozero.mq4' Ozero.mq4 1 1
'OrderClose' dönüş değeri kontrol edilmelidir Ozero.mq4 46 13
0 hata(lar), 1 uyarı(lar) 1 2



Derleyici ne hakkında uyarıyor? 46. satır OrderClose(OrderTicket(),OrderLots(),_Bid,15);


Göl.

 
tuner :

Çocuklar bana bugün ortaya çıkan bir aksaklıktan dolayı söyle.

EA, Cuma günü piyasa kapanmadan 15 dakika önce alım satımı durdurma yeteneğine sahiptir.

Yeni bir gün göründüğünde, EA Cuma olup olmadığını kontrol eder, ardından bugün StringToTime("23:59")-15*60'da alım satımı durdururuz.

Strateji test cihazında bu işlev doğru çalışıyor, ancak gerçek hayatta tamamen farklı bir resim görüyorum - danışman Cuma geldiğinde ilk tik ile ticareti durduruyor.

İşte uzmanların dergisinden baskılar:

Komisyoncu #1, demo:

0 05:59:47.731 Ölçekleyici GBPAUDpt,M1: Cuma Bitiş = 2014.10. 23 23:44:00

Broker №2, gerçek:

0 03:00:11.999 Ölçekleyici EURUSD,M1: Cuma Bitiş = 2014.10. 23 23:44:00

Yani, ilk tikte bugünün günlük çubuğu (24 Ekim Cuma) göründüğünde, EA

"23:59" dizesini bugünün gününü atamak yerine dünle zamana dönüştürür.

Ancak EA Cuma günü gün ortasında yeniden başlatılırsa, işin tamamlanma zamanını doğru bir şekilde belirleyecektir.

Bu sorunun nedenini buldum: https://forum.mql4.com/33023

Beklendiği gibi, bu pratik olarak StringToTime işlevinde bir hatadır. Tüm belirtiler birleşir. Bu işlev, "23:59" dizesini bir MT4 tarihi değil, yerel bir PC tarihi olan bir tarih saatine dönüştürür. Ve test cihazında, bildiğiniz gibi, yerel PC'nin tarihi öykünür ve terminalin saatine eşittir. Bu nedenle, test cihazında her şey olması gerektiği gibi çalışıyor, ancak demo / gerçek olanda bir aksaklık ve kayıplar ortaya çıkıyor. Tabii ki, belgeler tarihin nereden geldiğini söylemiyor ve yukarıdaki bağlantı, bu sorunun 4 yıl önce dile getirildiğini gösteriyor, ancak görünüşe göre üst alıntılar umursamıyor.

 
      RefreshRates();                     // Обновим данные
      _Bid=MarketInfo( "GBPUSD" ,MODE_BID);

       if (_Bid>=gPoint1)
        {
           for (pos= OrdersTotal ();pos>= 0 ;pos--)
             {
                OrderClose(OrderTicket()- 1 ,OrderLots(),_Bid, 15 );
             }      
       
        }

Bir soru daha. şunu doğru anlıyorum:

1. siparişlerin numaralandırılması "0" dan başlar.

2. Böyle bir kod, manuel olarak, hatta programlı olarak açmama rağmen kesinlikle tüm siparişleri kapatacak mı? Onlar. programın bu bölümünün kapatamayacağı bir emir var mı?


Göl.

 

Ekranda metin kaydırma yapan var mı? Örneğin - şöyle şöyle bir sipariş açılır/kapanır/değiştirilir vs.. Şöyle şöyle haberler var... ?

Yazık değilse, lütfen bir kod parçası gösterin.

Senks!

 
Vinin :
Alttaki daha iyi. Önce sipariş seçilmelidir.

Böyle daha iyi:

 //+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                         http://bomzh_inc.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Bomzh Inc"
#property link        "http://bomzh_inc.ucoz.ru"
#property version    "1.00"
#property strict
// -------- переменные --- Н -----
input double gLot= 0.1 ;           // Размер лота для покупки 
input double gPoint= 0.001 ;       // Дельта для закрытия 
input string symbol= "GBPUSD" ;     // Рабочая валютная пара
void OnTick () {
   // Открытие позиции
   if ( OrdersTotal ()== 0 ) {
       int ticket= 0 ;
       double _Ask= SymbolInfoDouble (symbol, SYMBOL_ASK );
       Print ( " Открытие первой позиции " );
      ticket= OrderSend (symbol,OP_BUY,gLot,_Ask, 15 , 0 , 0 );
       if (ticket> 0 ) Print ( "ОТКРЫТ ОРДЕР #" + IntegerToString (ticket));
      }
   //--- Закрытие позиций
   double _Bid= SymbolInfoDouble (symbol, SYMBOL_BID ); //для цены
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--) {
       if ( OrderSelect (pos,SELECT_BY_POS)) {
         if (OrderSymbol()!=symbol) continue ;
         if (OrderType()!=OP_BUY)   continue ;
         if (OrderOpenPrice()+gPoint<_Bid) {
             ResetLastError ();
             if (!OrderClose(OrderTicket(),OrderLots(),_Bid, 15 )) 
               Print ( "Чё-та не закрылася позиция. Фигня вот такая происходит: " + IntegerToString ( GetLastError ()));
            }
         }
      }
   //--- End OnTick()
}
//+------------------------------------------------------------------+
 
_new-rena :

Ekranda metin kaydırma yapan var mı? Örneğin - şöyle şöyle bir sipariş açılır/kapanır/değiştirilir vs.. Şöyle şöyle haberler var... ?

Yazık değilse, lütfen bir kod parçası gösterin.

Senks!

Boş bir gösterge penceresinde dikey kaydırma yaptım. İşte fonksiyon:

 //+------------------------------------------------------------------+
// Если bool print = true или нет окна индикатора, то функция будет выводить сообщения в журнал
void iPrint( string mess1, int sz= 9 , color color1= clrDarkGray , 
             string mess2= "" , color color2= clrDarkGray , 
             string mess3= "" , color color3= clrDarkGray , 
             string mess4= "" , color color4= clrDarkGray , 
             bool draws= true ) {
   string    NameGrafText, message, nm;
   int       i, y, k, shift, Win_Num=- 1 , num= 0 ;
   color     cl;
   Win_Num=WindowFind( "Win_Inform" );
   if (mess1== "" ) {
       //Print("Func iPrint: Передана пустая строка, выходим");
       return ;
      }
   if (!draws || Win_Num< 0 ) {
      message=mess1+mess2+mess3+mess4;
       Print (message); 
       return ;
      }
   k= ArraySize (Mass_Name_Message)- 1 ;
   if ( StringLen (mess1)> 0 ) num++;
   if ( StringLen (mess2)> 0 ) num++;
   if ( StringLen (mess3)> 0 ) num++;
   if ( StringLen (mess4)> 0 ) num++;
// Смещение и перекрашивание старых сообщений   
   for (i=k; i>= 0 ; i--) {                             
      NameGrafText=Mass_Name_Message[i];           
       if ( StringLen (NameGrafText)> 0 ) {
         if ( ObjectFind (NameGrafText)==Win_Num) {
             if (i+num>k) {                   // Удаляем самую верхнюю строчку
               ObjectDelete (NameGrafText);  
               Mass_Name_Message[i]= "" ;
               }
             else if (i+num<=k) {             // Сдвигаем и перекрашиваем старые сообщения
               Mass_Name_Message[i+num]=Mass_Name_Message[i];
               y=( int )ObjectGet(NameGrafText, OBJPROP_YDISTANCE );           // старая координата Y
               ObjectSet  (NameGrafText, OBJPROP_YDISTANCE , y+(sz+ 1 )*num); // новая координата Y
               ObjectSet  (NameGrafText, OBJPROP_COLOR , clrDimGray );       // новый цвет
               }
            }
         }
      }
// Вывод новых сообщений
   shift=num;
   uint v= GetTickCount ();
   for (i= 0 ; i<num; i++) {
      shift--;
      NameGrafText=Prefix+ "_GT_" + IntegerToString (i)+ "_" + IntegerToString (v);   // Уникальное имя объекта
       int app= 0 ;
       while ( ObjectFind (NameGrafText)==Win_Num) {   // Если всё-таки такой объект есть
         app++;
         NameGrafText=Prefix+ "_GT_" + IntegerToString (i)+ "_" + IntegerToString (v)+ "_" + IntegerToString (app); // добавим к его имени "хвостик"
         }
      Mass_Name_Message[num- 1 -i]=NameGrafText;
       switch (i) {
         case 0 : message=mess1; cl=color1; break ;
         case 1 : message=mess2; cl=color2; break ;
         case 2 : message=mess3; cl=color3; break ;
         case 3 : message=mess4; cl=color4; break ;
         default :message=mess1; cl=color1; break ;
         }
       ObjectCreate (NameGrafText, OBJ_LABEL , Win_Num, 0 , 0 );
      ObjectSetText(NameGrafText, message, sz, "Courier New" , cl);
      ObjectSet    (NameGrafText, OBJPROP_COLOR , cl);                   // цвет
      ObjectSet    (NameGrafText, OBJPROP_CORNER ,     2 );                 // угол
      ObjectSet    (NameGrafText, OBJPROP_XDISTANCE , 150 );               // координата Х
      ObjectSet    (NameGrafText, OBJPROP_YDISTANCE , 2 +(sz+ 1 )*shift);   // координата Y
      WindowRedraw();
      }
}
//+------------------------------------------------------------------+

Tek renkli mesaj kullanımına örnek olarak (farklı kelimeler için tek satırda 4 renk olabilir):

 if (get.BarOpenLastPos(sy, PERIOD_H4 ,OP_SELL,mn)!= 0 ) {
   string mess1= "На D1 вниз, на H4 ниже SAR, M15 сигнал. Продаём" ;
   iPrint(mess1, 9 , clrBlue );
   trade.OpenS(sy,lots,mn, 0.0 , 0.0 ,co);
   }

Win_Inform adlı grafikte boş bir gösterge olmalıdır.

Neden: