mql4 언어의 기능, 미묘함 및 작업 방법 - 페이지 2

 
메서드에서 GetPointer (this)를 자유롭게 반환하십시오.

적어도 setter 메소드에서는 이것이 정당화됩니다. 코드가 더 읽기 쉽고 간결해질 수 있으므로 이름이 지정된 매개변수를 얻을 수 있습니다.

ChartObject *hline=HLine::New(1.255).Color(clrGreen).Width(2).Selectable(true); // не надо помнить очерёдность параметров и можно писать в одну строку - цепочкой

// получается вот из подобного :
class HLine:public ChartObject {
public:
   HLine(double price);
   HLine *New(double _price) { return new HLine(_price); } // это чтобы не городить (new HLine(...)).Method1
   HLine *Color(color _clr) { fgColor=_clr; return GetPointer(this); }  // а это чтобы получались цепочки obj.Method1(..).Method2(..)
};
물론, 예외 `가 언어에 없고 예상되지 않기 때문에 주의해서 사용하십시오.

반환 유형에 의한 함수의 자격은 약간 간섭합니다.
 
Maxim Kuznetsov :
메서드에서 GetPointer(this)를 자유롭게 반환하십시오.
따라서 & 이것은 더 간결합니다.
 
fxsaber :
따라서 & 이것은 더 간결합니다.
예를 들어 디버깅 목적으로 GetPointer() 를 신중하게 재정의할 수 있습니다.
 
GetPointer 에서 가져온 포인터는 삭제할 수 없습니다.
 
// После этого в MQL4 будут компилироваться все библиотеки из MQL5\Include\Math
#property strict

#ifdef __MQL4__
  #include <Math\Alglib\bitconvert.mqh>  
  
  #define TEMP_MACROS(A) double A( double ) { return(0); }
    TEMP_MACROS(MathLog1p)
    TEMP_MACROS(MathExpm1)
    TEMP_MACROS(MathArcsinh)
    TEMP_MACROS(MathArccosh)
    TEMP_MACROS(MathArctanh)
  #undef TEMP_MACROS
#endif
 
Alexey Viktorov :
자, 먼저 시작하겠습니다.

주문을 마감하기 위해 주문 유형 과 이 유형에 해당하는 가격을 정의할 필요가 없습니다. OrderClosePrice() 가격으로 닫기를 작성하는 것으로 충분합니다.

/********************Script program start function********************/
void OnStart ()
{
   int i, total = OrdersTotal ()- 1 ;
     for (i = total; i >= 0 ; i--)
     {
       if ( OrderType () < OP_SELLSTOP )
       {
         if (! OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), 100 ))
         printf ( "***********" );
       }
     }
} /********************************************************************/


시원한! ) 감사해요.

예를 들어 판단하면 OrderSelect()가 필요하지 않습니까?

 
Liza_ :


시원한! ) 감사해요.

예를 들어 판단하면 OrderSelect()가 필요하지 않습니까?

필요합니다. 나는 Alexey가 공원을 통과하도록 ...
 
Liza_ :

시원한! ) 감사해요.

예, 이미 전투용으로 매우 간결한 스크립트를 작성할 수 있습니다.
 // Закрывает позиции, описание - https://www.mql5.com/ru/code/17943
sinput int RTOTAL = 4 ;             // Число повторов при неудачных сделках
sinput int SLEEPTIME = 1 ;         // Время паузы между повторами в секундах
sinput int Deviation_ = 10 ;       // Отклонение цены
sinput bool exAllSymbols = false ; // false - только текущий, true - все символы

#define _CS(A) ((! IsStopped ()) && (A))

bool CloseAllPositions( const bool AllSymbols = true , const int Slippage = 0 )
{
   bool Res = true ;
  
   for ( int i = OrdersTotal () - 1 ; _CS(i >= 0 ); i--)
     if ( OrderSelect (i, SELECT_BY_POS ) && ( OrderType () <= OP_SELL ) &&
        (AllSymbols ? true : ( OrderSymbol () == Symbol ())))
      Res &= OrderClose ( OrderTicket (), OrderLots (), OrderClosePrice (), Slippage);
      
   return (Res);
}

void OnStart ()
{
   for ( int i = 0 ; _CS((i < RTOTAL) && (!CloseAllPositions(exAllSymbols, Deviation_))); i++)
     Sleep (SLEEPTIME * 1000 );
}
MQL5 아날로그와의 비교는 분명히 유리하지 않습니다. 흥미롭긴 한데 비교 결과가 반대인 상황이...
 
Artyom Trishkin :
필요합니다. 나는 Alexey가 공원을 통과하도록했습니다 ...

그래... 정말 망했어.

그러나 그 전에는 이러한 주제를 만나지 않았습니다.

fxsaber :

따라서 해당 OrderSelect 직후에만 OrderClosePrice를 사용할 수 있습니다. 왜냐하면 OrderSelect는 Order(const) 함수에 대한 데이터를 한 번 복사하고 동일한 RefreshRates는 업데이트할 수 없습니다.

저것들. 예를 들어 OrderClosePrice로 닫을 수 없는 경우 다음 시도 전에 OrderSelect를 다시 만들어야 합니다(RefreshRates는 필요하지 않음).

위협 이것은 이미 2005년에 나온 주제입니다! 다음은 개발자의 자세한 주장입니다.

따라서 사용할 수 있지만 문제가 발생할 수 있음을 이해합니다.
 

미결 주문은 더 높은 수에서 분석해야 합니다. for(int nom=OrdersTotal()-1; nom>=0; nom--)
이것은 주문을 삭제할 때 특히 중요합니다.
그러나 반대의 경우 for(int nom=0; nom<OrdersTotal(); nom++) ?
먼저 인덱스가 0이고 번호가 0인 첫 번째 주문이 삭제됩니다.
그러면 인덱스는 1이 됩니다. 이때, 나머지 주문은 이동되고, 숫자가 1이었던 주문은,
제로 위치를 차지합니다. 이전 2번이 1번 자리를 차지했습니다. 그는 제거될 것입니다.
그러면 인덱스는 2가 됩니다. 그리고 처음에 있던 4번 순서는 삭제됩니다....
따라서 처음에 짝수 자리를 차지한 주문은 삭제됩니다. 그리고 이상한 것들은 남아 있습니다. 이는 주문 및 번호에 대한 댓글에서 확인할 수 있습니다.
제거 옵션과 스크린샷을 모두 보여주는 스크립트를 첨부합니다.
20개의 보류 주문이 생성됨

하나 뒤에 갔다

파일:
PROBA-ORD.mq4  3 kb