MQL의 비동기 및 다중 스레드 프로그래밍 - 페이지 19

 
Igor Makanu :
...


다시 한 번 반복합니다. 거래 터미널에 왜 필요한지 질문에 답하십시오.

...

그리고 터미널은 하나의 흐름으로 작동합니까? 세트에 있다면 모두 동일하지만 왜 필요한가요?)))

 
Реter Konow :

당신은 많은 이야기를 할 수 있습니다.

흠, 그리고 topikstarter가 어디에 있습니까? - 글은 많이 쓰는데 읽지 않고 발전하고 싶지 않으신가요? - 당신은 기사를 이해하기 위해 내 링크를 따라갈 시간이 없었을 뿐만 아니라 그것을 읽을 시간도 없었을 것입니다. 여기 내가 찾은 마지막 것에서, 여기 "장로의 3번째 화면"에 있는 코드가 있습니다. 나는 누군가에게 썼습니다. 코드 구조는 항상 대략 이렇습니다(기본 논리를 변경하는 개선 사항이 더 이상 없다면 코드가 있습니다 ... 초기에 선형 구조화된 코드 로 전환할 수 있는 것을 기억하지 않는 것이 좋습니다(()

 void OnTick ()
  {
   int takeprofit,stoploss,hstart= 0 ; 
   double lot,h[];
   CopyClose (symbol,PeriodSecondary,hstart,HistoryCount,h);
   ENUM_CMD CMD1,CMD2,CMD3;
   CMD1 = ind1();
   CMD2 = ind2();
   CMD3 = ind3();
   if (NewBar())
     {
      DeleteOrdersLimits(Magic);
       if (CMD1==CMD_BUY && CMD2==CMD_BUY && CMD3==CMD_BUY)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if (ReversSignal)SELL_STOP_PR(Low[ 1 ],lot,Magic,stoploss,takeprofit); else BUY_STOP_PR(High[ 1 ],lot,Magic,stoploss,takeprofit);
        }
       if (CMD1==CMD_SELL && CMD2==CMD_SELL && CMD3==CMD_SELL)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if (ReversSignal)BUY_STOP_PR(High[ 1 ],lot,Magic,stoploss,takeprofit); else SELL_STOP_PR(Low[ 1 ],lot,Magic,stoploss,takeprofit);
        }
     }
  }
//+------------------------------------------------------------------+

아래에는 모든 서비스 기능이 있지만 주요 코드 자체 - TS 자체는 가장 읽기 쉽고 선형적인 논리입니다. 저는 항상 이렇게 썼습니다. 당신은 그것을 통과하지 않을 것입니다)))


무엇을 위한 것입니까? - 예, 다시 한 번: 멀티스레딩은 다른 솔루션이 없는 경우에만 사용해야 합니다. 마찬가지로 적절한 프로그래머 중 누구도 비동기식 작업으로 작업하지 않을 것입니다! - 아파! ))))


예를 들면 다음과 같습니다. 거래 터미널에 왜 필요한지 질문에 답하십시오.

 
Yuriy Asaulenko :
예, 부두에 있지만 실제로는 없습니다. 내가 이해하는 한도에서는.
Volchansky는 이것에 대해 썼고 Renat는 그에게 대답했습니다.
일반적으로 단일 스레드 프로그램에서 타사 소프트웨어와의 상호 작용 없이 콜백이 필요한 이유를 상상하기 어렵습니다.

이제 나는 시도했다. 모든 것이 작동합니다.

MQL에서 실제로 사용되지는 않지만.

 
Igor Makanu :

거래 터미널에 왜 필요한지 질문에 답하십시오.

그들은 모두 멀티스레딩의 오버헤드를 잊었습니다. 그리고 그들은 못생겼다.)
 
Igor Makanu :
...


예를 들면 다음과 같습니다. 거래 터미널에 왜 필요한지 질문에 답하십시오.

나는 이미 당신에게 대답했습니다. 당신은 무시합니다.

1. 내 프로그램이 훨씬 더 복잡하기 때문에 멀티스레딩이 필요합니다. 많은 무거운 기능을 하나의 프로그램에 결합하고 싶습니다. 3D 시각화, 서버와의 통신, GUI 및 다양한 계산. 하나의 스레드로는 충분하지 않습니다. 따라서 프로그램을 여러 부분으로 분할하거나 표준 멀티스레딩을 사용해야 합니다. 존재하지 않으면 프로그램을 여러 부분으로 나눕니다.

2. 터미널 자체가 다중 스레드입니다. 멀티스레딩이 필요한 이유 - 개발자에게 문의하십시오. 멀티스레딩이 필요한 이유는 1번 항목을 참조하십시오.

 

Igor Makanu

예를 들면 다음과 같습니다. 거래 터미널에 왜 필요한지 질문에 답하십시오.

글쎄, 가장 분명한 것은 별도의 인터페이스 쓰레드인데, 이것은 기니에게 특히 중요하다. 비록 내가 그것 없이도 관리하지만 말이다.

추신: 만약 그렇다면, 저는 멀티스레딩을 위한 캠페인을 하고 있지 않습니다.

 
Реter Konow :

나는 이미 당신에게 대답했습니다. 당신은 무시합니다.

1. 내 프로그램이 훨씬 더 복잡하기 때문에 멀티스레딩이 필요합니다. 많은 무거운 기능을 하나의 프로그램에 결합하고 싶습니다. 3D 시각화, 서버와의 통신, GUI 및 다양한 계산. 하나의 스레드로는 충분하지 않습니다. 따라서 프로그램을 여러 부분으로 분할하거나 표준 멀티스레딩을 사용해야 합니다. 존재하지 않으면 프로그램을 여러 부분으로 나눕니다.

2. 터미널 자체가 다중 스레드입니다. 멀티스레딩이 필요한 이유 - 개발자에게 문의하십시오. 멀티스레딩이 필요한 이유는 1번 항목을 참조하십시오.

당신은 또한 그들이 당신에게 쓰는 것을 무시합니다. 나는 이미 썼습니다. 별도로 날아갑니다 - 커틀릿은 별도로! GUI와 거래 전략은 같은 코드에서 실행되어서는 안됩니다!

그래픽 인터페이스에 대한 접근 방식에 대한 주제에서 코드가 효율적이지 않다는 말을 들었고 일부 기능을 별도의 스레드에 던지면 성능이 향상될 것이라고 생각합니까? - 성능은 향상되지 않지만 추가 쓰레기가 있을 것입니다. 지금 모든 것을 동기화하는 방법))))

추신 : 나는 Android에 관한 주제에서 4pda에 대한 사용자의 의사 소통을 기억했습니다. 장치, 사용자는 여유 메모리 양에 의해서만 펌웨어 버전의 효과를 확신하고 정확히 반대입니다. 여유 메모리가 많을수록 펌웨어가 더 가파르고, 그러나 불행히도 OS는 메모리를 포함하여 모든 리소스를 효율적으로 사용해야 한다는 이해가 없습니다. 여유 메모리가 많다고 OS가 리소스를 효율적으로 사용하는 것은 아닙니다. 따라서 하나의 스레드에서 성능을 달성할 수 없으므로 더 많은 스레드가 필요합니다! - 언어(플랫폼, OS ..)의 기능이 아니라 개발자에 관한 것일 수 있습니다. - 아마도 효과가 없을까요? ;) - 작년에 일련의 기사에서 그래픽 인터페이스를 확인했고 KB에서 명백한 속도 저하를 보지 못했습니다. 모든 것이 좋은 수준에서 작동합니다. 이 코드의 소스, 인터페이스 요소를 우회하기 위한 체계, OOP 접근 방식 자체를 살펴보았습니다. 모든 것이 Windows의 그래픽 원칙과 매우 유사합니다. 모든 것이 작동하지만 당신에게는 그렇지 않은 이유는 무엇입니까? )))))) - 아마도 모두 동일하지만 초기 접근 방식이 올바르지 않았습니까? 또는 이론 교육이 양쪽 발에 절름발이입니까?

 
Igor Makanu :

당신은 또한 그들이 당신에게 쓰는 것을 무시합니다. 나는 이미 썼습니다. 별도로 날아갑니다 - 커틀릿은 별도로! GUI와 거래 전략은 같은 코드에서 실행되어서는 안됩니다!

그래픽 인터페이스에 대한 접근 방식에 대한 주제에서 코드가 효율적이지 않다는 말을 들었고 일부 기능을 별도의 스레드에 던지면 성능이 향상될 것이라고 생각합니까? - 성능은 향상되지 않지만 추가 쓰레기가 있을 것입니다. 지금 모든 것을 동기화하는 방법))))

추신 : 나는 Android에 관한 주제에서 4pda에 대한 사용자의 의사 소통을 기억했습니다. 장치, 사용자는 여유 메모리 양에 의해서만 펌웨어 버전의 효과를 확신하고 정확히 반대입니다. 여유 메모리가 많을수록 펌웨어가 더 가파르고, 그러나 불행히도 OS는 메모리를 포함하여 모든 리소스를 효율적으로 사용해야 한다는 이해가 없습니다. 여유 메모리가 많다고 OS가 리소스를 효율적으로 사용하는 것은 아닙니다. 따라서 하나의 스레드에서 성능을 달성할 수 없으므로 더 많은 스레드가 필요합니다! - 언어(플랫폼, OS ..)의 기능이 아니라 개발자에 관한 것일 수 있습니다. - 아마도 효과가 없을까요? ;) - 작년에 일련의 기사에서 그래픽 인터페이스를 확인했고 KB에서 명백한 속도 저하를 보지 못했습니다. 모든 것이 좋은 수준에서 작동합니다. 이 코드의 소스, 인터페이스 요소를 우회하기 위한 체계, OOP 접근 방식 자체를 살펴보았습니다. 모든 것이 Windows의 그래픽 원칙과 매우 유사합니다. 모든 것이 작동하지만 당신에게는 그렇지 않은 이유는 무엇입니까? )))))) - 아마도 모두 동일하지만 초기 접근 방식이 올바르지 않았습니까? 또는 이론 교육이 양쪽 발에 절름발이입니까?

뭔가 효과가 없거나 효과가 없다고 결정한 이유는 무엇입니까? 내 프로필로 이동하여 모든 것이 어떻게 작동하는지 확인하세요. 모든 것이 제대로 작동하고 개발 중이기 때문에 멀티스레딩이 급박하게 필요하다고 생각합니다.

 
Vict :

글쎄, 가장 분명한 것은 별도의 인터페이스 쓰레드인데, 이것은 기니에게 특히 중요하다. 비록 내가 그것 없이도 관리하지만 말이다.

추신: 만약 그렇다면, 저는 멀티스레딩을 위한 캠페인을 하고 있지 않습니다.

글쎄, 당신은 시장에 제품이 없습니다. 그렇다면 이제 MCL에 쉽게 연결되는 C #에서 쉽게 수행되는 GUI를 MCL에서 수행하는 이유는 무엇입니까? 그리고 이 GUI는 이미 초기에 자체 스레드에서 작동합니다.

 
Igor Makanu :

void OnTick ()
  {
   MqlTask obj1;
   MqlTask obj2;
   MqlTask obj3;
   MqlTask obj4;

   int takeprofit,stoploss,hstart= 0 ; 
   double lot,h[];

   bool success = false;

   CTask *task1 = obj1. CALLBACK_FUNC ( CopyClose (symbol,PeriodSecondary,hstart,HistoryCount,h));   //Выполняется асинхронно в пуле потоков
   success = task1 -> Run ();
   success = task1 -> Wait (0);  
   

   ENUM_CMD CMD1,CMD2,CMD3;
   CMD1 = ind1();
   CMD2 = ind2();
   CMD3 = ind3();

   if (NewBar())
     {
       CTask *task2   = obj2. CALLBACK_FUNC (DeleteOrdersLimits(Magic));  //Выполняется асинхронно в пуле потоков
      success = task2 -> Run ();
      success = task2 -> Wait (0);

       if (CMD1==CMD_BUY && CMD2==CMD_BUY && CMD3==CMD_BUY)
        {
         CTask *task3 = obj3. CALLBACK_FUNC (CalcTakeProfitStopLoss(takeprofit,stoploss));  //Выполняется асинхронно в пуле потоков
         success = task3 -> Run ();
         success = task3 -> Wait (0);

         lot=CalcLot(stoploss);
         if (ReversSignal)SELL_STOP_PR(Low[ 1 ],lot,Magic,stoploss,takeprofit); else BUY_STOP_PR(High[ 1 ],lot,Magic,stoploss,takeprofit);
        }
       if (CMD1==CMD_SELL && CMD2==CMD_SELL && CMD3==CMD_SELL)
        {
         CTask *task4 = obj4. CALLBACK_FUNC (CalcTakeProfitStopLoss(takeprofit,stoploss));  //Выполняется асинхронно в пуле потоков
         success = task4 -> Run ();
         success = task4 -> Wait (0);

         lot=CalcLot(stoploss);
         if (ReversSignal)BUY_STOP_PR(High[ 1 ],lot,Magic,stoploss,takeprofit); else SELL_STOP_PR(Low[ 1 ],lot,Magic,stoploss,takeprofit);
        }
     }

     delete task1;  //Очищаем ресурсы
     delete task2;
     delete task3;
     delete task4;
  }
//+------------------------------------------------------------------+


다음은 하나의 스레드에서 선형 비동기 코드를 작성하는 예시적인 예입니다.
mql에서 EventLoop의 기능은 ThreadPool 개발자에 의해 정기적으로 구현되고 구현됩니다.
사용자는 스트림에 올라갈 필요가 없습니다! 개발자는 적절한 클래스를 작성하여 이를 처리해야 합니다.
프로그램은 단일 스레드에서 실행되고 일반 비차단 콜백은 스레드 풀에서 실행됩니다!
이제 단순 콜백 함수를 계산량이 많거나 병렬 함수로 교체하십시오.
메가 편리함과 모든 것이 병렬))



파일:
node.js.png  48 kb