Hatalar, hatalar, sorular - sayfa 195

 
Interesting :
Büyük olasılıkla öyle. Ayrıca zamanlayıcıya bağlı kodun yarısına sahibim, şimdi yeni bir yapı için beklemem veya koltuk değneği bulmam gerekecek :(

Aynen, OnTimer'ı OnTick olarak değiştirdim ve her şey eskisi gibi gitti, ancak çekirdeklerin optimizasyonu aynı anda değil sırayla gerçekleşir. Bana öyle geliyor ki geliştiriciler bu tür bariz hataları çabucak düzeltecekler (umarım).

 
Interesting :

İşte zamanlayıcıyı tetiklemeyen kod

Ve burada kolayca

Benim durumumda, yardımcı olmadı.
 
Erm955 :

Aynen, OnTimer'ı OnTick olarak değiştirdim ve her şey eskisi gibi gitti, ancak çekirdeklerin optimizasyonu aynı anda değil sırayla gerçekleşir. Bana öyle geliyor ki geliştiriciler bu tür bariz hataları çabucak düzeltecekler (umarım).

Ayrıca bana özel olaylardaki bariz hataların (test cihazında çalışma) hızlı bir şekilde düzeltileceği görülüyordu. Hala koltuk değneği kullanmak zorundayım... :(
Valmarlar :
Benim durumumda, yardımcı olmadı.

Muhtemelen özellikler vardır.

Win 2003 Server SP2 x32'de (AMD 2600+, tek çekirdekli) denedim. Ve "boş" Uzman Danışman hakkında söylenebilir. Sadece iki değişken ve birkaç fonksiyon eklendi (zamanlayıcının durumunu belirlemek ve ilk başlatmayı yakalamak).

 

10005 kodu nereye gitti ve ne anlama geliyor?

İstek (10004) ile "istek reddedildi" ( 10006 ) arasındaki orta nokta nedir?

 2010.11 . 13 23 : 44 : 14      Core 1    2010.11 . 11 22 : 00 : 30    CTrade::PositionOpen: instant sell 0.10 #IBM at 145.38 [unknown retcode 10005 ]
2010.11 . 13 23 : 44 : 14      Core 1    2010.11 . 11 22 : 00 : 30    prices for #IBM 0.10 ( 145.38 / 145.41 / 145.38 )
2010.11 . 13 23 : 44 : 14      Core 1    2010.11 . 11 22 : 00 : 30    CTrade::PositionOpen: instant buy 0.10 #IBM at 145.41 [unknown retcode 10005 ]
2010.11 . 13 23 : 44 : 14      Core 1    2010.11 . 11 22 : 00 : 30    prices for #IBM 0.10 ( 145.38 / 145.41 / 145.38 )
 

2010 şampiyonası tartışmasında https://championship.mql5.com/2010/en/users/capr katılımcı Uzman Danışmanının kodunu yayınladı. Derlemeye çalıştım (derleme 355). Derleme sonucunda çeşitli uyarılar verilir. Bir sonraki noktayla ilgileniyorum. Kodun şu parçacığı var:

 void CountOrderStop( string symbol)
  {
   datetime from= 0 ;
   datetime to= TimeCurrent ();
//--- запросить всю историю
   HistorySelect (from,to);
//--- переменные для получения значений из свойств ордера
   ulong     ticket;
   double    open_price;
   double    initial_volume;
   datetime time_setup;
//   string   symbol;
   string    type;
   long      order_magic;
   count_sell_stop= 0 ;
   count_buy_stop= 0 ;

//--- количество текущих отложенных ордеров
   uint      total= OrdersTotal ();
//--- пройдем в цикле по всем ордерам
   for ( uint i= 0 ;i<total;i++)
     {
       //--- получим тикет ордера по его позиции в списке
       if (ticket= OrderGetTicket (i) && (GetOrderType( OrderGetInteger ( ORDER_TYPE ))== "buy stop limit" || GetOrderType( OrderGetInteger ( ORDER_TYPE ))== "buy stop" || GetOrderType( OrderGetInteger ( ORDER_TYPE ))== "buy limit" ) && OrderGetString ( ORDER_SYMBOL )==symbol)
        {
         //--- получим свойства ордера
         open_price=       OrderGetDouble ( ORDER_PRICE_OPEN );
         time_setup=       OrderGetInteger ( ORDER_TIME_SETUP );
         symbol=           OrderGetString ( ORDER_SYMBOL );
         order_magic=       OrderGetInteger ( ORDER_MAGIC );
         int positionID =   OrderGetInteger (ORDER_POSITION_ID);
         initial_volume=   OrderGetDouble ( ORDER_VOLUME_INITIAL );
         type=GetOrderType( OrderGetInteger ( ORDER_TYPE ));
         count_buy_stop=count_buy_stop+ 1 ;
        }
       if (ticket= OrderGetTicket (i) && (GetOrderType( OrderGetInteger ( ORDER_TYPE ))== "sell stop limit" || GetOrderType( OrderGetInteger ( ORDER_TYPE ))== "sell limit" || GetOrderType( OrderGetInteger ( ORDER_TYPE ))== "sell stop" ) && OrderGetString ( ORDER_SYMBOL )==symbol)
        {
         //--- получим свойства ордера
         open_price=       OrderGetDouble ( ORDER_PRICE_OPEN );
         time_setup=       OrderGetInteger ( ORDER_TIME_SETUP );
         symbol=           OrderGetString ( ORDER_SYMBOL );
         order_magic=       OrderGetInteger ( ORDER_MAGIC );
         int positionID =   OrderGetInteger (ORDER_POSITION_ID);
         initial_volume=   OrderGetDouble ( ORDER_VOLUME_INITIAL );
         type=GetOrderType( OrderGetInteger ( ORDER_TYPE ));
         count_sell_stop=count_sell_stop+ 1 ;
        }
        count_order = count_buy_stop + count_sell_stop;
     }
//---
  }

Aynı türdeki iki if(ticket= ...) yapısından, derleyici yalnızca sonuncusu için "ifade boolean değildir" uyarısı verir (yani, önceki benzer uyarıyı "maskeler"). uyarıda belirtilenler yorumlanır (derleyiciyi kontrol etmek için!), değişmemiş, ancak önceki derleme sırasında protokolde eksik olan daha yüksek seviyeli bir benzer yapı için bir uyarı verilir.

Bu bir özellik mi yoksa bir hata mı?

 

Hatalar , MetaTrader 5 MQL , Açıldı , Başlatıldı: 2010.11.06 11:32 , #25823

biraz cevap ver

 

Bilmiyorum belki öyle olmalı ama dosyaya yazarken

 class tick{
   public :
      MqlTick  data;             //новые тиковые данные
      bool     refresh();        //метод обновления тиковых данных с проверкой на поступление новых данных
      void     write();          //запись тиковых данных в файл
.........

void tick::write( void ){
   if (file_handle> 0 ) FileWrite (file_handle,data.bid);
}

bazen normalleştirilmemiş fiyatlar alıyorum:

81.42
81.41
81.41
81.400000000000001
81.400000000000001
81.400000000000001
81.400000000000001
81.41
81.400000000000001
81.41
81.41

niye ya?

ve bir şekilde FileWriteStruct ( file_handle,data, sizeof(data));

 
normalleştirilmemiş bir fiyatla, her şey açık görünüyor: Bunu ana dallar için (henüz), çaprazlar için görmedim - nadiren bazıları için ve daha sık diğerleri için - bu bana terminalde bu tür verileri verdikleri anlamına geliyor
 
IgorM :

ve bir şekilde FileWriteStruct ( file_handle,data, sizeof(data));

Bir ikili dosyaya yazmanız gerekiyor - https://www.mql5.com/ru/docs/files/filewritearray

FileWriteArray

Dizeler dışında herhangi bir türdeki dizileri bir BIN dosyasına yazar (dizeler ve dinamik diziler içermeyen bir yapı dizisi olabilir).

int FileWriteArray (
    int     file_handle , // dosya tanıtıcısı
    geçersiz    dizi[] , // dizi
    int     start_item=0 , // dizideki indeksi başlat
    int     item_count=WHOLE_ARRAY     // eleman miktarı
);

Örneğin (mevcut girişlerin üzerine yazılmaması için kodun sonlandırılması gerekir):

 //+------------------------------------------------------------------+
//|                                         Test_FileWriteStruct.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link       "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class Tick
  {
private :
   int                m_file_handle;


public :
   MqlTick            data;             //новые тиковые данные
   void Tick(){m_file_handle= FileOpen ( "tickrecords.dat" , FILE_READ | FILE_WRITE | FILE_BIN );};
   void ~Tick(){ if (m_file_handle!= INVALID_HANDLE ) FileClose (m_file_handle);};
   bool               refresh();         //метод обновления тиковых данных с проверкой на поступление новых данных
   void               write();           //запись тиковых данных в файл

  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Tick::refresh( void )
  {
   bool res= SymbolInfoTick ( Symbol (),data);
   if (!res) Print ( "Неудачный вызов SymbolInfoTick(), ошибка " , GetLastError ());
   return (res);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Tick::write( void )
  {
   if (m_file_handle!= INVALID_HANDLE ) FileWriteStruct (m_file_handle,data,size);
   else Print ( "Не удалось записать данные в файл. Ошибка " , GetLastError ());
  }

Tick tick;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   if (tick.refresh()) tick.write();

  }
//+------------------------------------------------------------------+

 

Документация по MQL5: Файловые операции / FileWriteArray
Документация по MQL5: Файловые операции / FileWriteArray
  • www.mql5.com
Файловые операции / FileWriteArray - Документация по MQL5
 
Rosh :

Bir ikili dosyaya yazmanız gerekiyor - https://www.mql5.com/en/docs/files/filewritearray

Örneğin (mevcut girişlerin üzerine yazılmaması için kodun sonlandırılması gerekir):

Tamam, devasa ATP ve sadece test için bir metin dosyasına yazdım, MqlTick'in aslında bir yapı olduğundan şüphe etmeye başladım bile :)

Not: fena değil - aslında, sınıfımı ve kodumu geri yüklediler;) - MT5'te çevrimdışı çizelgelerinizi oluşturmak istememeniz üzücü - Bir grup MT4 + MT5 için yazıyorum, çok fazla bağlıydım. -standart TF

Dosyalar: