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

 
Aleksey Mavrin :

테스터를 말하는 건가요 아니면 온라인을 말하는 건가요?

온라인인 경우 - 이동 이벤트가 정상적으로 전달되지 않는 코드를 확인합니다. 그건 그렇고, 사이트에는 5개의 다른 라이브러리만 있습니다. 무슨 말씀이십니까?

그리고 테스터에서 - 그것은 전혀 그렇지 않은 것 같습니다. 그리고 그 이유는 무엇입니까?

모든 패널 개체에 이동 명령을 보낸 후 ChartRedraw() 를 수행합니다.
 
Aleksey Mavrin :

테스터를 말하는 건가요 아니면 온라인을 말하는 건가요?

온라인인 경우 - 이동 이벤트가 정상적으로 전달되지 않는 코드를 확인합니다. 그건 그렇고, 사이트에는 5개의 다른 라이브러리만 있습니다. 무슨 말씀이십니까?

그리고 테스터에서 - 그것은 전혀 그렇지 않은 것 같습니다. 그리고 그 이유는 무엇입니까?

온라인에 관한 것입니다. 테스터에서 나는 이것이 정말로 필요하지 않습니다. 나는 라이브러리에 대해 당신에게 대답할 수 없습니다, 나는 프로그래밍의 완전한 멍청이입니다. 방금 MQL5 참조에서 준비 버튼 코드를 가져왔습니다.

테스터에서 사용할 수 있도록 OnTick 기능 에 버튼 이동 명령을 삽입했습니다. 이것이 아마도 다음 틱에서 버튼 위치가 업데이트되는 이유일 것입니다. 버튼을 배경과 함께 움직이는 방법을 이해하지 못합니다.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Artyom Trishkin :
모든 패널 개체에 이동 명령을 보낸 후 ChartRedraw()를 수행합니다.
이 작업을 시도했지만 도움이 되지 않았습니다.
   ObjectSetInteger ( 0 , "Buy" ,             OBJPROP_XDISTANCE , x + 2 );
   ObjectSetInteger ( 0 , "Buy" ,             OBJPROP_YDISTANCE , y + 2 );
   ChartRedraw ();
  
   ObjectSetInteger ( 0 , "Sell" ,           OBJPROP_XDISTANCE , x + 74 );
   ObjectSetInteger ( 0 , "Sell" ,           OBJPROP_YDISTANCE , y + 2 );
   ChartRedraw ();
 
알아낼 수 있도록 도와주세요. 거래 패널이 주문이 작동하지 않는 경우 후속 후행과 함께 보류 중인 매수 중지 주문 을 여는 코드가 있습니다. 주문이 열렸지만 주문이 수정되지 않고 로그에 오류가 나타나지 않으며 주문을 수정하려는 시도도 없습니다. 다음 기능을 사용하여 오류가 발생한 단계에서 로그를 추적하려고 했습니다.
 Print ( "Ордер Выбран!" );

각 if 조건 뒤에 방금 삽입했습니다.

그 결과 다음과 같은 기능을 발견했습니다.

 for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
           if (aorder.SelectByIndex(i))  

추가 작업을 위한 주문을 성공적으로 선택하고 if Print(" Order Selected!"); 이 코드 뒤에 붙여넣기 :

 if (aorder. Symbol ()==asymbol.Name() && aorder.Magic()==MagicNumber && Ask < aorder.PriceOp
en())

그런 다음 오류가 발생합니다.

2020.06.17 01:38:24.136 2020.01.02 07:40:00 수정 주문 #2 매수 정지 0.1 EURUSD_i at 1.12086 sl: 1.12023 tp: 1.12275 -> 1.00000, sl: 1.00000 tp: 1.0Invalid

2020.06.17 01:38:24.136 2020.01.02 07:40:00 CTrade::OrderSend: #2 수정 at 1.00000 (sl: 1.00000 tp: 1.00000) [잘못된 가격]

2020.06.17 01:38:24.136 2020.01.02 07:40:00 BUY STOP 수정 실패! 결과 Retcode: 10015, Retcode에 대한 설명: 잘못된 가격

자동 거래를 위해 다른 Expert Advisor에서 동일한 코드를 사용합니다(유일한 차이점은 부재:

 ObjectGetInteger ( 0 , "Buy Stop" , OBJPROP_STATE ) == true


) 문제가 없습니다. 질문 없이 주문을 열고 수정합니다.

다음은 코드 자체입니다.

     double Ask          = NormalizeDouble (PriceInformation_High_Buy[HighestCandle_High_Buy].high, _Digits ) + indent; // максимум самой высокой свечи плюс отступ
     double sl_buy       = NormalizeDouble (PriceInformation_Low_Buy[LowestCandle_Low_Buy].low, _Digits ) - indent;     // минимум самой низкой свечи минус отступ  
     double tp_buy       = Ask + ((Ask - sl_buy) * Профит_фактор);                                                     // количество стопов лоссов 
     
     if   ( OrdersTotal ()== 0 && PositionsTotal ()== 0 &&                                          // проверка на наличие открытых позиций и ордеров
     ObjectGetInteger ( 0 , "Buy Stop" , OBJPROP_STATE ) == true )                                 // проверка состояния кнопки
                                                                                             
     {
        atrade.BuyStop(Lots, Ask, _Symbol , sl_buy, tp_buy, ORDER_TIME_GTC , 0 , "My comment" ); // посылаем ордер Buy Stop
        ObjectSetInteger ( 0 , "Buy Stop" , OBJPROP_STATE , false );                               // отжимаем кнопку
     }

     else

     ObjectSetInteger ( 0 , "Buy Stop" , OBJPROP_STATE , false );                                  // отжимаем кнопку
       
//---Трейлинг Buy Stop---------------------------------------------------------------------------------------------------------------------------//     
      
         for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
           if (aorder.SelectByIndex(i))                                                                       // выбираем ордер 
       
             if (aorder. Symbol ()==asymbol.Name() && aorder.Magic()==MagicNumber && Ask < aorder.PriceOpen()) // проверяем символ, мэджик номер, цену
               
              {
                 if (aorder.OrderType()== ORDER_TYPE_BUY_STOP )
                 Print ( "Ордер Выбран!" ); 
                 if (aorder.PriceCurrent()<aorder.PriceOpen())
                 
                    {
                     if (atrade.OrderModify(aorder.Ticket(),
                        asymbol.NormalizePrice(Ask),
                        asymbol.NormalizePrice(sl_buy),
                        asymbol.NormalizePrice(tp_buy),
                        aorder.TypeTime(),
                        aorder.TimeExpiration()))
                         Print ( "Модификация BUY STOP прошла успешно! Тикет ордера = " ,atrade.ResultOrder());
                     else
                         Print ( "Модификация BUY STOP прошла с ошибкой! Result Retcode: " ,atrade.ResultRetcode(),
                               ", description of Retcode: " ,atrade.ResultRetcodeDescription());
                    }
              }

내 실수가 무엇인지 알려주세요.

 
Mikhail :

온라인에 관한 것입니다. 테스터에서 나는 이것이 정말로 필요하지 않습니다. 나는 라이브러리에 대해 당신에게 대답할 수 없습니다. 저는 프로그래밍의 완전한 멍청이입니다. 방금 MQL5 참조에서 버튼 코드를 가져왔습니다.

테스터에서 사용할 수 있도록 OnTick 기능 에 버튼 이동 명령을 삽입했습니다 . 이것이 아마도 다음 틱에서 버튼 위치가 업데이트되는 이유일 것입니다. 버튼을 배경과 함께 움직이는 방법을 이해하지 못합니다.

그리고 그 다음 항목이 아닌 다음 항목에 정확히 무엇이 있는지 결정하는 것이 얼마나 흥미로웠습니까?)

 
Mikhail :
알아낼 수 있도록 도와주세요. 거래 패널이 주문이 작동하지 않는 경우 후속 후행과 함께 보류 중인 매수 중지 주문 을 여는 코드가 있습니다. 주문이 열렸지만 주문이 수정되지 않고 로그에 오류가 나타나지 않으며 주문을 수정하려는 시도도 없습니다. 다음 기능을 사용하여 오류가 발생한 단계에서 로그를 추적하려고 했습니다.

각 if 조건 뒤에 방금 삽입했습니다.

그 결과 다음과 같은 기능을 발견했습니다.

추가 작업을 위한 주문을 성공적으로 선택하고 if Print(" Order Selected!"); 이 코드 뒤에 붙여넣기 :

그런 다음 오류가 발생합니다.

2020.06.17 01:38:24.136 2020.01.02 07:40:00 수정 주문 #2 매수 정지 0.1 EURUSD_i at 1.12086 sl: 1.12023 tp: 1.12275 -> 1.00000, sl: 1.00000 tp : 1.0Invalid

2020.06.17 01:38:24.136 2020.01.02 07:40:00 CTrade::OrderSend: #2 수정 at 1.00000 (sl: 1.00000 tp: 1.00000) [잘못된 가격]

2020.06.17 01:38:24.136 2020.01.02 07:40:00 BUY STOP 수정 실패! 결과 Retcode: 10015, Retcode에 대한 설명: 잘못된 가격

자동 거래를 위해 다른 Expert Advisor에서 동일한 코드를 사용합니다(유일한 차이점은 부재:


) 문제가 없습니다. 질문 없이 주문을 열고 수정합니다.

다음은 코드 자체입니다.

내 실수가 무엇인지 알려주세요.

분명히 Normalize는 정상적으로 작동하지 않습니다. 1로 반올림합니다. asymbol.Digits() asymbol.TickSize(),..Point() 검사를 인쇄합니다.

 

모두에게 좋은 하루. Expert Advisor가 DLL에 액세스할 때 다음 문제가 발생했습니다.

'C:\....\shablon.dll'을 로드할 수 없습니다. [487]

오류 487은 ERROR_INVALID_ADDRESS를 의미하지만 라이브러리 경로는 정확합니다. 사실, 나는 이미 이 dll을 모든 폴더에 넣었지만 도움이 되지 않습니다.

무엇이 잘못될 수 있습니까? 도움을 주시면 감사하겠습니다.


추신: 이 dll은 원래 32비트 Windows용으로 만들어졌으며 mt4 * 86에서 작동했습니다. 64비트용으로 재컴파일해서 이제 mt5 * 64에 올려놓았는데 이게 문제입니다.



 
Aleksey Mavrin :

그리고 그 다음 항목이 아닌 다음 항목에 정확히 무엇이 있는지 결정하는 것이 얼마나 흥미로웠습니까?)

새 틱이 도착할 때까지 버튼은 움직이지 않습니다. 이것은 내 눈으로 보는 것입니다. 가격이 변경 되자마자 버튼이 움직였다.

오늘은 새 틱에서도 버튼이 다시 그리기를 멈췄지만 아무 것도 변경하지 않았습니다. 배경만 움직입니다.
 
Aleksey Mavrin :

분명히 Normalize는 정상적으로 작동하지 않습니다. 1로 반올림합니다. asymbol.Digits() asymbol.TickSize(),..Point() check 를 출력합니다.

내가 다음과 같이 요청할 때:

 Print (" Symbol ", _Symbol , " Digits ", _Digits , " Point ", Point ());

나는이 결과를 얻는다 :

2020.06.17 13:49:53.270 2020.01.02 06:50:00 기호 EURUSD_i 자릿수 5 포인트 1e-05

내가 다음과 같이 요청할 때:

 Print (" Symbol ",aorder.Symbol(), " Digits ", asymbol. Digits (), " Point ", asymbol.TickSize());

나는이 결과를 얻는다 :

2020.06.17 13:51:58.787 2020.01.02 06:45:00 기호 EURUSD_i 자릿수 0 포인트 0.0

동시에 인쇄 기능 을 삽입하지 않으면 오류가 전혀 발생하지 않으며 주문 수정을 시도하지도 않는다는 점에 유의하고 싶습니다. CTrade가 내 주문을 보지 않는 것과 같습니다.

기호 및 매직 넘버 확인 실패:

 Print ( "Symbol " , asymbol.Name(), " Magic " , aorder.Magic(), " Ticket ", aorder.Ticket()); 

결과:

2020.06.17 14:37:38.147 2020.01.02 06:50:00 심볼 매직 0 티켓 2

마법은 유로 달러 기호인 12345여야 합니다.

심볼과 마법을 얻을 수 없는 이유는 무엇입니까?

다음과 같은 경우:

aorder. Symbol ()==asymbol.Name()

로 변경

aorder. Symbol ()== _Symbol

매직 넘버로 수표를 제거하면 가격에 문제가 있습니다.

[2020.06.17 01:38:24.136 2020.01.02 07:40:00 주문 수정 #2 매수 스톱 0.1 EURUSD_i at 1.12086 sl: 1.12023 tp: 1,0vali price 1.12023 tp: 1,0sl.0.12275 -> 0.0sl

2020.06.17 01:38:24.136 2020.01.02 07:40:00 CTrade::OrderSend: 1.00000에서 #2 수정 (sl: 1.00000 tp: 1.00000) [잘못된 가격]

2020.06.17 01:38:24.136 2020.01.02 07:40:00 BUY STOP 수정 실패! 결과 Retcode: 10015, Retcode에 대한 설명: 잘못된 가격

나는 이미 내 머리를 부러뜨렸다. 다른 고문의 동일한 코드가 쾅 작동한다는 사실에도 불구하고.

내가 무엇을 잘못하고 있지?

Документация по MQL5: Общие функции / Print
Документация по MQL5: Общие функции / Print
  • www.mql5.com
Данные типа double выводятся с точностью до 16 десятичных цифр после точки, при этом данные могут выводиться либо в традиционном либо в научном формате – в зависимости от того, как запись будет наиболее компактна. Данные типа float выводятся с 5 десятичными цифрами после точки. Для вывода вещественных чисел с другой точностью либо в явно...
 
dozolov :

모두에게 좋은 하루. Expert Advisor가 DLL에 액세스할 때 다음 문제가 발생했습니다.

'C:\....\shablon.dll'을 로드할 수 없습니다. [487]

오류 487은 ERROR_INVALID_ADDRESS를 의미하지만 라이브러리 경로는 정확합니다. 사실, 나는 이미 이 dll을 모든 폴더에 넣었지만 도움이 되지 않습니다.

무엇이 잘못될 수 있습니까? 도움을 주시면 감사하겠습니다.


추신: 이 dll은 원래 32비트 Windows용으로 만들어졌으며 mt4 * 86에서 작동했습니다. 64비트용으로 재컴파일해서 이제 mt5 * 64에 올려놓았는데 이게 문제입니다.



ERROR_INVALID_ADDRESS는 경로에 관한 것이 아닙니다. 잘못된 인수를 전달하고 있습니다.