Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 223

 
Tünaydın. Lütfen acemi bir tüccarın , keyfi kar alma yeteneği ile döviz çiftlerinde kilit emirleri açabilen uygun bir otomatik ticaret EA bulmasına yardımcı olun. Teşekkür ederim.
 
abcxyzabcxyz :
Tünaydın. Lütfen acemi bir tüccarın, keyfi kar alma yeteneği ile döviz çiftlerinde kilit emirleri açabilen uygun bir otomatik ticaret EA bulmasına yardımcı olun. Teşekkür ederim.
Gerçekten kilitlemeye ihtiyacınız varsa - o zaman buradasınız . MetaTrader 5 platformu ağ oluşturduğu için MetaTrader 5'te kilitleme yoktur.
MQL4: форум по механическим торговым системам и тестированию стратегий
  • www.mql5.com
MQL4: форум по механическим торговым системам и тестированию стратегий
 
micle :
Bir seçenek olarak: hepsinde, tür tanımlayıcısını döndürdüğünüz Type yöntemini bildirin.

Heh, kaynak kodu düzenlemek mümkün olsaydı... Her şeyi bu kadar basitleştirmeye gerek yok. Ama yine de - mql5'te bir sınıf adı var mı???

 
YAndrey :

Heh, kaynak kodu düzenlemek mümkün olsaydı... Her şeyi bu kadar basitleştirmeye gerek yok. Ama yine de - mql5'te bir sınıf adı var mı???

Şablonlara doğru bakın. Bu kod, bir sınıfın veya ilkel türün adını döndürür.

#include <Ticaret\Ticaret.mqh>
//+------------------------------------------- ------ ----------------------+
//| |
//+------------------------------------------- --------------------+
geçersiz   Açılışta ()
{
//---
CTrade ticareti;
çift d_değeri=M_PI;
    int i_value=INT_MAX;
    Yazdır ( "d_value: type=" ,GetTypeName(d_value), ", value=" , d_value);
    Print ( "i_value: type=" ,GetTypeName(i_value), ", value=" , i_value);
    Print ( "ticaret: type=" ,GetTypeName(ticaret));
//---
}
//+------------------------------------------- --------------------+
//| Türü bir dize olarak döndürür |
//+------------------------------------------- ------ ----------------------+
şablon < typename T>
string GetTypeName( const T & t)
{
//--- türü bir dizge olarak döndür
    dönüş ( typename (T));
//---
}

 
C-4 :

Şablonlara doğru bakın. Bu kod, bir sınıfın veya ilkel türün adını döndürür.

#include <Ticaret\Ticaret.mqh>
//+------------------------------------------- --------------------+
//| |
//+------------------------------------------- ------ ----------------------+
geçersiz   Açılışta ()
{
//---
CTrade ticareti;
çift d_değeri=M_PI;
    int i_value=INT_MAX;
    Yazdır ( "d_value: type=" ,GetTypeName(d_value), ", value=" , d_value);
    Print ( "i_value: type=" ,GetTypeName(i_value), ", value=" , i_value);
    Print ( "ticaret: type=" ,GetTypeName(ticaret));
//---
}
//+------------------------------------------- --------------------+
//| Türü bir dize olarak döndürür |
//+------------------------------------------- --------------------+
şablon < typename T>
string GetTypeName( const T & t)
{
//--- türü bir dizge olarak döndür
    dönüş ( typename (T));
//---
}

İçinde! Bir şeyim var! Ama yeni ile çalışmıyor - kodda neye ihtiyacım olduğuna dair bir örnek var - biri bana hangi yöntemleri söyleyebilir?

class a{
public :
virtual void Print (){ Print ( "Print class a" );}
};

class b: public a{
public :
virtual void Print (){ Print ( "Print class b" );}
};

class c: public a{
public :
virtual void Print (){ Print ( "Print class c" );}
void Print2(){ Print ( "!Print2! class c" );}
};


void add(a *&arr[], bool var)
{
   ArrayResize (arr, ArraySize (arr)+ 1 );
   if (var)
      arr[ ArraySize (arr)- 1 ] = new b;
   else
      arr[ ArraySize (arr)- 1 ] = new c;
   
}

void OnStart ()
  {
//--- 
   
   
   a *arr[];

   add(arr, true ); // На самом деле здесь я НЕ знаю, какой класс добавит функция add
   add(arr, false ); // Это потомок класса а или сам класс а, исходный код которого я править не могу.
   for ( int i = 0 ; i < ArraySize (arr); i++)
   {
       // Вот тут то мне и надо узнать, что за класс там
       // шаблон вернет *а, как и объявлено. Но мне надо проверить - можно ли вызвать функцию, которая есть только в с
       if (i == 1 ) // Вот тут должна быть проверка на имя класса
      {
         c *tmp = arr[i];
         tmp.Print2();
      }
    }  
   
   
   
   
   
//--- 
  }
 
YAndrey :

İçinde! Bir şeyim var! Ama yeni ile çalışmıyor - kodda neye ihtiyacım olduğuna dair bir örnek var - biri bana hangi yöntemleri söyleyebilir?

Bu bir şablon yöntemi sorunudur. Ne yazık ki, şablon yöntemi, örneğe başvuran sınıfın adını döndürür. Örneğin kendisinin türü hala bilinmiyor.
 

Birisi bana yukarıdaki kodun neden gerçek zamanlı olarak çalıştığı halde test cihazında çalışmadığını açıklayabilir mi !!? HistoryOrderGetInteger... özelliklerinin neden HistorySelect(0, TimeCurrent()) 'dan sonra test cihazında mevcut olmadığıyla özellikle ilgileniyorum.

 #include <Trade\Trade.mqh>

CTrade trade;

int OnInit ()
{
   trade.LogLevel(LOG_LEVEL_NO);
   return INIT_SUCCEEDED ;
}
void OnTick ()
{
   if (!DetectNewBar()) return ;
   trade.Sell( 0.1 );
   HistorySelect ( 0 , TimeCurrent ());
   for (; dealsCount < HistoryDealsTotal (); dealsCount++)
   {
       ulong ticket = HistoryDealGetTicket (dealsCount);
      RecalcDeal(ticket);
   }
}

bool DetectNewBar( void )
{
   MqlRates bars[ 1 ];
   CopyRates ( Symbol (), PERIOD_M1 , 0 , 1 , bars);
   if (bars[ 0 ].time != timeLastBar)
   {
      timeLastBar = bars[ 0 ].time;
       //printf(expertName + " new bar detected: " + TimeToString(bars[0].time));
       return true ;
   }
   return false ;
}

void RecalcDeal( ulong ticketDeal)
{
   //History is selected in OnTick()!
   ulong ticketOrder = HistoryDealGetInteger (ticketDeal, DEAL_ORDER );
   //if(!HistoryOrderSelect(ticketOrder))
   //   printf("order not select.");
   ENUM_ORDER_TYPE type = ( ENUM_ORDER_TYPE ) HistoryOrderGetInteger (ticketOrder, ORDER_TYPE );
   datetime time = HistoryOrderGetInteger (ticketOrder, ORDER_TIME_SETUP ); 
   ulong time_msc = HistoryOrderGetInteger (ticketOrder, ORDER_TIME_SETUP_MSC ); 
   printf ( "Order: " + ( string )ticketOrder + " Type: " + EnumToString (type) + " Time: " + ( string )time +
           " Time msc: " + ( string )time_msc + " Total Orders: " + HistoryOrdersTotal ());
}

int dealsCount;

datetime timeLastBar;

Strateji test cihazında ekran görüntüsü:

Demoda gerçek zamanlı ekran görüntüsü:

ps İlginç bir şekilde, test cihazındaki ilk sipariş doğru bir şekilde işlenirken geri kalanı değil. Ve yine de, HistroryOrderSelect(ticketOrder) yorumunu kaldırırsanız, o zaman gerçek zamanlı olarak siparişin seçilmediğine dair bir mesaj görünür ve strateji test cihazında tam tersine, ilk sipariş dışında her şey çalışmaya başlar.

 

Ve HistorySelect() ile ilgili bir sorunum var. Piyasa emri göndererek script ile pozisyon açıyorum ve eğer bir fırsat açılırsa script lansmanından bu yana tarihteki işlem sayısına hemen bakıyorum ve saniyede 10 kez aralıklarla kontrol ediyorum. Elbette tek bir anlaşma olmalı. İşte komut dosyası:

 void OnStart ()
{
         // время запуска скрипта
         datetime dtStartTime = TimeCurrent ();
        
         // структуры запроса
         MqlTradeRequest oRequest = { 0 };
         MqlTradeResult oResult = { 0 };
        
         // формируем запрос
        oRequest.action = TRADE_ACTION_DEAL ;
        oRequest.magic  = 15 ;
        oRequest.symbol = _Symbol ;
        oRequest.volume = 0.1 ;
        oRequest.type   = ORDER_TYPE_BUY ;
        oRequest.type_filling = ORDER_FILLING_FOK ;
        oRequest.price  = SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
        oRequest.deviation = 1000 ;
        
         // шлём ордер
         bool bResult = OrderSend (oRequest, oResult);
        
         // если позиция успешно открыта
         if (bResult == true && oResult.retcode == 10009 ) // если позиция открыта
        {
                 for ( int i = 0 ; i < 10 ; i++)
                {
                         // запрашиваем историю за время работы скрипта
                         HistorySelect (dtStartTime, TimeCurrent ());
                
                         // количество сделок за время работы скрипта (должна быть одна)
                         Print ( "Шаг: " , i, " Совершено сделок: " , HistoryDealsTotal ());
                        
                         Sleep ( 1000 );
                }
        }
}

Ve işte Alpha Forex'teki sonuç:

Anlaşma aslında yapıldı ve 10 saniye sonra bile tarihte değil. Bu ne? Hata MT'si? Hata Alfa? Bilmediğim bir özellik mi? Alpari için, aynı komut dosyası iyi çalışıyor, yalnızca ilk (sıfır) adımda sıfır atlamalar (peki, bu anlaşılabilir - tarih henüz güncellenmedi), diğer tüm adımlar bir. Ama on saniye sonra, tarihte neden anlaşma yok?

 
Algo :

Ve HistorySelect() ile ilgili bir sorunum var. Piyasa emri göndererek script ile pozisyon açıyorum ve eğer bir fırsat açılırsa script lansmanından bu yana tarihteki işlem sayısına hemen bakıyorum ve saniyede 10 kez aralıklarla kontrol ediyorum. Elbette tek bir anlaşma olmalı. İşte komut dosyası:

Ve işte Alfa Broker'ın sonucu:

Anlaşma aslında yapıldı ve 10 saniye sonra bile tarihte değil. Bu ne? Hata MT'si? Hata Alfa? Bilmediğim bir özellik mi? Alpari için, aynı komut dosyası iyi çalışıyor, yalnızca ilk (sıfır) adımda sıfır atlamalar (peki, bu anlaşılabilir - tarih henüz güncellenmedi), diğer tüm adımlar bir. Ama on saniye sonra, tarihte neden anlaşma yok?

suşlar dize

tarihsaat dtStartTime = TimeCurrent();

dtStartTime ve TimeCurrent() zamanına göre aynı sayı olmadığından emin misiniz? Belki bir saniyelik yuvarlama, tamamlanmış bir ticareti dtStartTime'ın dışına çıkarır.

 
C-4 :

suşlar dize

tarihsaat dtStartTime = TimeCurrent();

dtStartTime ve TimeCurrent() zamanına göre aynı sayı olmadığından emin misiniz? Belki bir saniyelik yuvarlama, tamamlanmış bir ticareti dtStartTime'ın dışına çıkarır.

Ve bir şey olsa bile, MT'nin bu saniyede tarih vermesi gerekmez mi? Onlar. sınırları kendisi de dahil olmak üzere belirlenen sınırlar içinde hikayeyi vermiyor mu?

Ama yine de, hem dtStartTime = TimeCurrent() - 1 hem de dtStartTime = TimeCurrent() - 10 yazmayı denedim. Faydası olmuyor.

Neden: