MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 833

 
Igor Zakharov :

수정 ... 하지만 어떤 이유로 하나 남아



그러나 테스터에서 재현할 수 없습니다. 같은 날짜에 나는 단순히이 오류가 없습니다


 

C++에서 라이브러리를 mql4에 연결할 수 없는 이유는 무엇입니까? 다음은 Visual Studio 2012 C++ 코드입니다. cpp 확장자 포함(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; }

다음 으로 내보낸 함수 목록이 있는 기본 확장자가 def(main.def)인 파일을 만들었습니다. 코드는 다음과 같습니다.

LIBRARY "dllmt42"
EXPORTS
add

다음으로 컴파일러는 import

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

컴파일에는 문제가 없지만 어드바이저를 차트에 놓으면 버그가 뜬다

해결되지 않은 가져오기 함수 호출, 'dllmt42.dll'에서 '_add'를 찾습니다. Total Commander는 파일을 끌 때 함수를 컴파일러 자체로 봅니다.

누가 도울 수 있습니까?

 
Alexandr Sokolov :

수정 ... 하지만 어떤 이유로 하나 남아

그러나 테스터에서 재현 할 수 없습니다. 같은 날짜에 나는 단순히이 오류가 없습니다

이 오류는 이미 수정한 가격으로 위치/주문을 수정하려고 함을 나타냅니다...

 

다음 기능을 사용하여 MT5에서 표시기 데이터를 가져오려고 합니다.

 //************************************************************************************************/
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 ]);
}
//************************************************************************************************/

오류 메시지를 표시합니다.


MT5용 코드 수정 방법을 알려주세요

 
Vladimir Pastushak :

이 오류는 이미 수정한 가격으로 위치/주문을 수정하려고 함을 나타냅니다...

아닙니다. 이미 여러 번 확인했지만 문제는 항상 호환되지 않는 제품을 테스트할 때 MQL 자체의 입력 매개변수 선택의 무작위성으로 판명되었습니다. 이 문제도 이미 수정했습니다. 그러나 지금은 미결 주문이 없다고 말합니다.


같은 쌍과 시간대에 가지고 있지만

 
Alexandr Sokolov :

아니요, 이미 여러 번 확인했지만 문제는 항상 호환되지 않는 제품을 테스트할 때 MQL 자체의 입력 매개변수 선택의 임의성으로 판명되었습니다. 이 문제도 이미 수정했습니다. 그러나 지금은 미결 주문이 없다고 말합니다


같은 쌍과 시간대에 가지고 있지만

고문이 거래하지 않는 이유를 이해하십시오.

 
Vladimir Pastushak :

고문이 거래하지 않는 이유를 이해하십시오.

신호가 발생하지 않도록 입력 매개변수가 무작위로 선택되면 거래를 하지 않을 수 있습니다. 그러나 제한되어서도 안됩니다.

 

"무역 동결 거리 "란 무엇을 의미합니까? ~을 통해

 SymbolInfoInteger ( _Symbol , SYMBOL_TRADE_FREEZE_LEVEL )

MQL4

 

수정할 때 오류 #1이 다시 발생했습니다. 이 EA에서는 SL 또는 TP 레벨이 4개의 블록에서만 수정됩니다.


1블록

 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블록

 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블록

 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블록

 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 );
                 };


나는 이미 모든 것을 여러 번 확인했지만 오류를 찾을 수 없습니다

 
Alexandr Sokolov :

수정할 때 오류 #1이 다시 발생했습니다. 이 EA에서는 SL 또는 TP 레벨이 4개의 블록에서만 수정됩니다.



OrderStopLoss() != NormalizeDouble ( 0 , _Digits )


이것은 정확하지 않으며 다른 예에서도 마찬가지입니다.

1.2356에서 정지하고 새로운 틱에서 다시 1.2356에서 정지하면 오류 1이 발생합니다.