KimIVの便利な機能 - ページ 13

 
olyakish:

Igorさん、「INIファイルを扱うための関数ライブラリ」で質問したのですが、返事がありません :(


ありがとうございます...という答えが...

 

ClosePosBySelect()関数です。

あらかじめ選択した1ポジションを閉じる。この関数は、他のいくつかの関数から呼び出されるため、むしろ補助的なものであり、ある条件によって閉じるべき位置を選択するのに役立つ。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 19.02.2008                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  bool   fc;
  color  clClose;
  double ll, pa, pb, pp;
  int    err, it;

  if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      pa=MarketInfo(OrderSymbol(), MODE_ASK);
      pb=MarketInfo(OrderSymbol(), MODE_BID);
      if (OrderType()==OP_BUY) {
        pp=pb; clClose=clCloseBuy;
      } else {
        pp=pa; clClose=clCloseSell;
      }
      ll=OrderLots();
      fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
      if (fc) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        err=GetLastError();
        if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
        Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
              ErrorDescription(err),", try ",it);
        Print(OrderTicket(),"  Ask=",pa,"  Bid=",pb,"  pp=",pp);
        Print("sy=",OrderSymbol(),"  ll=",ll,"  sl=",OrderStopLoss(),
              "  tp=",OrderTakeProfit(),"  mn=",OrderMagicNumber());
        Sleep(1000*5);
      }
    }
  } else Print("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
}
 
KimIV:

ありがとうございます...という答えが...

そこにもまた疑問(というか発言)が :)

 
KimIV:

ClosePosBySelect()関数です。

あらかじめ選択した1ポジションを閉じる。この関数は、他のいくつかの関数から呼び出され、ある条件に従って閉じるべき位置を選択するのに役立つので、むしろ補助的なものである。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 19.02.2008                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  bool   fc;
  color  clClose;
  double ll, pa, pb, pp;
  int    err, it;

  if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      pa=MarketInfo(OrderSymbol(), MODE_ASK);
      pb=MarketInfo(OrderSymbol(), MODE_BID);
      if (OrderType()==OP_BUY) {
        pp=pb; clClose=clCloseBuy;
      } else {
        pp=pa; clClose=clCloseSell;
      }
      ll=OrderLots();
      fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
      if (fc) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        err=GetLastError();
        if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
        Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
              ErrorDescription(err),", try ",it);
        Print(OrderTicket(),"  Ask=",pa,"  Bid=",pb,"  pp=",pp);
        Print("sy=",OrderSymbol(),"  ll=",ll,"  sl=",OrderStopLoss(),
              "  tp=",OrderTakeProfit(),"  mn=",OrderMagicNumber());
        Sleep(1000*5);
      }
    }
  } else Print("Некорректная торговая операция. Close ",GetNameOP(OrderType()));
}

こんにちは。

失礼します。

1)行の意味がわからないfor (it=1; it<=NumberOfTry; it++)

これはどのようなループなのでしょうか?

2) if (!testing() ......) break という条件もよくわかりません。

3) そして最後に、これはどのような機能ですか? ErrorDescription(err)," ,

差し支えなければ、説明してください。

 

1.これは、トレードの試行錯誤のサイクルである。もし取引サーバーがエラーを返した場合、この関数は結局ポジションを閉じるために何度も 試行錯誤を行うことになります。私は通常NumberOfTry=5と します。

2. この条件は、オンラインで動作しているExpert Advisorが停止 したときに、試行のサイクルを正しく終了させる機能を実装しています。この条件がないと、例えばEAのプロパティを呼び出すには、EAがすべてのトレードを試みるまで待つか、EAをチャートから削除する必要がありました。

3.Look in file ..\experts⇄libraries⇄stdlib.mq4

 

EAを無限ループで動作させる方法をお聞きしたいのですが、パラメータの設定にアクセスすることは可能でしょうか?

こんな感じでスタートで書きました。

while (true)
{
  // проверка на останов и прочее
      if (IsStopped()) 
        return(-1);
  while (isRefresh == false)
       isRefresh = RefreshRates();
      
  // некий код
  // задержка
  Sleep(G_Period);   
}

しかし、この場合、Expert Advisorはハングアップしてしまい、チャートから削除する以外、何もできません。

 

ヴァレラ、そうしてくれ。


while (IsExpertEnabled() && !IsStopped())
{
  while (!RefreshRates()) Sleep(500);
      
  // некий код
  // задержка
  Sleep(G_Period);   
}
 

ClosePosBySizeProfitInCurrency()関数を使用します。

預入通貨での利益が一定額を超えたポジションのみを決済する機能です。どのポジションをクローズしなければならないかは、関数パラメータで指定することができます。

  • sy- 楽器の名称。このパラメータを定義すると、指定した楽器の位置だけをチェックする機能になります。NULLは 現在の楽器、""(デフォルト)は任意の楽器を意味します。
  • op- 貿易業務、ポジションタイプ。有効な値:OP_BUYOP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子(MagicNumber).デフォルト値-1- 任意のMagicNumberを意味する。
  • pr- 預け入れ通貨での利益水準。デフォルト値 -0
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие тех позиций, у которых профит в валюте депозита       |
//|             превысил некоторое значение                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pr - профит                                                             |
//+----------------------------------------------------------------------------+
void ClosePosBySizeProfitInCurrency(string sy="", int op=-1, int mn=-1, double pr=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()>pr) ClosePosBySelect();
          }
        }
      }
    }
  }
}
 
KimIV:

ヴァレラ、そうしてくれ。


while (IsExpertEnabled() && !IsStopped())
{
  while (!RefreshRates()) Sleep(500);
      
  // некий код
  // задержка
  Sleep(G_Period);   
}

しかし、これはekspertをブロードキャストしてしまうので、チャートから削除するまでそのパラメータにアクセスすることができません。

 
scorpionk:

残念なことに、これはEAをブロードキャストしてしまうので、チャートから削除するまでそのパラメータにアクセスすることができません。

ただし、ツールバーの「EAs」ボタンを押すと、EAを停止 することができます。