mql4言語の特徴、微妙なニュアンスとテクニック - ページ 2

 
メソッドからGetPointer(this)を返すのはご自由に。

少なくともメソッド・セッターでは、これは正当化されるでしょう - コードはより読みやすく、コンパクトになるかもしれません。

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)を返すのはご自由に。
このように&thisは より簡潔です。
 
fxsaber:
このように&thisは より簡潔です。
また、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()に "close at price "と書くだけで十分です!

/********************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()も必要ないのでは?

はい、そうです。アレクセイは見逃しただけ...。
 
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-analogueとの比較では、有利とは言えません。比較結果が逆になる場面もあるのでは......。
 
Artyom Trishkin:
必要である。ただ、怠慢で見逃してしまっただけなのですが・・・。

ええ、まあ...本当にメチャクチャ。

しかし、以前は、このような話題に出会うことはありませんでした。

fxsaber

そのため、OrderClosePriceは対応するOrderSelectの後にのみ使用することができます。OrderSelectはOrder(const)-functionsのデータを一度コピーするので、同じRefreshRatesでは更新ができないのです。

つまり、例えばOrderClosePriceがクローズできなかった場合、次の試行の前にOrderSelectを再度行う必要があります(RefreshRatesは必要ありません)。

ZS このスレッドは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
理由: