MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 833

 
Igor Zakharov :

Düzeltildi ... Ama nedense bir tane kaldı



Ancak, test cihazında çoğaltamıyorum. Aynı tarihte, sadece bu hatayı yaşamıyorum


 

Kütüphaneyi neden c++'dan mql4'e bağlayamıyorum? İşte benim Visual Studio 2012 c++ kodum. cpp uzantılı (main.ssr)

 #define MT4_EXPFUNC __declspec(dllexport) создал макрос чтобы не писать запись __declspec(dllexport)int __stdcall add(int a=0, int b=0)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)и так пробовал тоже
MT4_EXPFUNC int __cdecl add( int a= 0 , int b= 0 ) //stdcall данная примитивная функция ничего не делает а просто возвращает значение 18
{ return ( 18 );пробовал так return 18; }

Daha sonra, dışa aktarılan işlevlerin bir listesini içeren def (main.def) ana uzantısına sahip bir dosya oluşturdum, kod şöyle görünüyor:

LIBRARY "dllmt42"
EXPORTS
add

Ardından, derleyici bir içe aktarma yaptı

 #import "dllmt42.dll"
int _add( int a= 0 , int b= 0 );
#import

Derlemede herhangi bir sorun yok, ancak danışmanı grafiğe bıraktığınızda bir hata çıkıyor.

çözümlenmemiş içe aktarma işlevi çağrısı, 'dllmt42.dll' içinde '_add' öğesini bulun. Total Commander, bir dosyayı sürüklerken işlevi derleyicinin kendisi olarak görür

Kim yardım edebilir?

 
Alexandr Sokolov :

Düzeltildi ... Ama nedense bir tane kaldı

Ancak, test cihazında çoğaltamıyorum. Aynı tarihte, sadece bu hatayı yaşamıyorum

Bu hata, bir pozisyonu/siparişi halihazırda değiştirmiş olduğunuz fiyattan değiştirmeye çalıştığınızı gösterir...

 

Şu işlevi kullanarak MT5'teki gösterge verilerini almaya çalışıyorum:

 //************************************************************************************************/
double Envelopes( string symb, ENUM_TIMEFRAMES TF_1, int period, int method, int shift, int price, double Deviation( ENUM_TIMEFRAMES TF_2, int kanal), int buff, int index)
{
   double buf[ 1 ];
   int handle= iEnvelopes ( Symbol (), TF_1, period, method, shift, price, Deviation(TF_2, kanal), buff);
   if (handle< 0 )
   {
     Print ( "Failed to create handle ATR, Error: " , GetLastError ());
     return ( WRONG_VALUE );
   } else
   {
     if ( CopyBuffer (handle, 0 ,index, 1 ,buf)< 0 )
    {
     Print ( "Failed to copy data from the indicator ATR, Error: " , GetLastError ());
     return ( WRONG_VALUE );
    }
   }
   return (buf[ 0 ]);
}
//************************************************************************************************/

Bir hata mesajı verir:


MT5 kodunu nasıl düzelteceğimi söyle

 
Vladimir Pastushak :

Bu hata, bir pozisyonu/siparişi daha önce değiştirmiş olduğunuz fiyattan değiştirmeye çalıştığınızı gösterir...

Hayır, bunu defalarca kontrol ettim, sorun her zaman uyumlu olmayan ürünleri test ederken MQL'nin girdi parametrelerinin seçiminin rastgeleliği olduğu ortaya çıktı - bunu da zaten düzelttim. Ama şimdi açık sipariş yok diyor.


Aynı çiftlerde ve zaman dilimlerinde olmama rağmen

 
Alexandr Sokolov :

Hayır, bunu defalarca kontrol ettim, sorun her zaman uyumlu olmayan ürünleri test ederken MQL'nin girdi parametrelerinin seçiminin rastgeleliği olduğu ortaya çıktı - bunu da zaten düzelttim. Ama şimdi açık sipariş yok diyor.


Aynı çiftlerde ve zaman dilimlerinde olmama rağmen

Danışmanın neden ticaret yapmadığını anlayın.

 
Vladimir Pastushak :

Danışmanın neden ticaret yapmadığını anlayın.

Giriş parametreleri rastgele seçilirse, sinyaller basitçe ortaya çıkmazsa ticaret yapamaz. Ama bununla da sınırlı kalmamalıdır.

 

"Ticari donma mesafesi " ile ne kastedilmektedir? vasıtasıyla

 SymbolInfoInteger ( _Symbol , SYMBOL_TRADE_FREEZE_LEVEL )

MQL4

 

Değiştirirken yine 1 numaralı hatayı aldım. Bu EA'da, SL veya TP seviyeleri yalnızca dört blokta değiştirilir


1 blok

 if (OrderMagicNumber() == id_number && OrderStopLoss() != NormalizeDouble ( 0 , _Digits ) && BMod(OrderTicket()) == true )
           {
             if (OrderType() == OP_BUY)
              {
               if (OrderComment() == "1" && Bid - OrderOpenPrice() >= a1 && OrderStopLoss() != NormalizeDouble (OrderOpenPrice() + l1, _Digits )) {bol = OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble (OrderOpenPrice()+l1, _Digits ),OrderTakeProfit(), 0 , clrNONE );};
               if (OrderComment() == "2" && Bid - OrderOpenPrice() >= a2 && OrderStopLoss() != NormalizeDouble (OrderOpenPrice() + l2, _Digits )) {bol = OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble (OrderOpenPrice()+l2, _Digits ),OrderTakeProfit(), 0 , clrNONE );};
              }
             else
              {
               if (OrderComment() == "1" && OrderOpenPrice() - Ask >= a1 && OrderStopLoss() != NormalizeDouble (OrderOpenPrice() - l1, _Digits )) {bol = OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble (OrderOpenPrice()-l1, _Digits ),OrderTakeProfit(), 0 , clrNONE );};
               if (OrderComment() == "2" && OrderOpenPrice() - Ask >= a2 && OrderStopLoss() != NormalizeDouble (OrderOpenPrice() - l2, _Digits )) {bol = OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble (OrderOpenPrice()-l2, _Digits ),OrderTakeProfit(), 0 , clrNONE );};
              };


2 blok

 if (BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && (OrderStopLoss() == NormalizeDouble ( 0 , _Digits ) || OrderTakeProfit() == NormalizeDouble ( 0 , _Digits )))
           {
             if (OrderComment() == "1" )
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1), 0 , clrNONE );
              }
             else if (OrderComment() == "2" )
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() - sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t2 : OrderOpenPrice() - t2), 0 , clrNONE );
              };


3 blok

 if (BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && (OrderStopLoss() == NormalizeDouble ( 0 , _Digits ) || OrderTakeProfit() == NormalizeDouble ( 0 , _Digits )))
           {
             if (OrderComment() == "1" )
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1), 0 , clrNONE );
              }
             else if (OrderComment() == "2" )
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t2 : OrderOpenPrice() - t2), 0 , clrNONE );
              };


4 blok

 if (BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && OrderTakeProfit() == NormalizeDouble ( 0 , _Digits ))
              {
               if (MyOrders() == 1 )
                 {
                  bol = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1), 0 , clrNONE );
                 }
               else if (OrderTakeProfit() == 0 )
                 {
                  bol = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),(OrderType() == OP_BUY ? OrderOpenPrice() + (OrderComment() == "1" ? t1 : t2) : OrderOpenPrice() - (OrderComment() == "1" ? t1 : t2)), 0 , clrNONE );
                 };


Her şeyi zaten birçok kez kontrol ettim ama hatayı bulamıyorum

 
Alexandr Sokolov :

Değiştirirken yine 1 numaralı hatayı aldım. Bu EA'da, SL veya TP seviyeleri yalnızca dört blokta değiştirilir



OrderStopLoss() != NormalizeDouble ( 0 , _Digits )


Bu doğru değil, aynısı diğer örneklerde de geçerli

1.2356'da bir stop koyarsanız ve yeni bir tick'te tekrar 1.2356'da stop koyarsanız, 1 hatası alırsınız.