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

 

受け入れていただきありがとうございます...;)

AND, OR, NOTとは
は難しいことではなく、こういうちょっとしたコードの使い方や用途に興味があるだけなんです。

あるいは、たとえばこんなことも。
-aと bが 等しいという条件は簡単に実装できる a==b
- しかし、aが bに対して unequalという条件は、実装が難しい...。

また基本的な ことを持ち出して申し訳ありませんが、これはおそらく多くの初心者に重宝されるでしょう...。

ここでは、戦闘訓練条件を含む既成のコードを紹介します。:)
フィールドの定義や配置から、プログラマーの手書きまで......すべてが揃っている。
https://www.mql5.com/ru/forum/51521

 
kombat писал (а):
- しかし、a is UNEQUAL tobという 条件がすでに難点になっている...。
a!=b;
 
イゴールさん、ちょっとテーマから外れて解説に入ってしまったようですね。
もしよろしければ、タスクバーのショートカットに何でも表示する機能を提案させてください。

、仕事中にターミナルを開かずにEAのパフォーマンスを監視するのに使っています(覗き見が多い)。他のケースでも役に立つかもしれません。

//----------- タスクバーでの可視化機能 -------------------------------------
void ProfMT(string X)
{
int hwnd1 = WindowHandle(Symbol(), Period());
int hwnd_parent1 = 0;
while (!IsStopped())
{
hwnd1= GetParent(hwnd1);
if (hwnd1 == 0) break;
hwnd_parent1 = hwnd1;
}.
if (hwnd_parent1 != 0) SetWindowTextA(hwnd_parent1,X);
}.
ありがとうございます。
 

ほらね...。フォーラムほど早く真実を知ることができる場所は他にあるでしょうか...。;)

ありがとうございます!そして、話がずれてしまってすみません。
本のスレッドでもっと質問してみようと思います・・・。

 

テスターのOpenPosition()関数です。

ポジションを開くように設計されている - 市場価格で購入または売却する取引操作。この機能は多通貨に対応しており、現在のシンボルだけでなく、任意のシンボルのポジションを建てることができます。例えば、EURUSDのチャート上でEAを実行し、USDCADを取引することができます。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание : Открытие позиции. Версия функции для тестов на истории.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" - текущий символ)                   |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
void OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
  color  clOpen;
  double pp;
  int    err, ticket;
 
  if (sy=="") sy=Symbol();
  if (op==OP_BUY) {
    pp=MarketInfo(sy, MODE_ASK); clOpen=clOpenBuy;
  } else {
    pp=MarketInfo(sy, MODE_BID); clOpen=clOpenSell;
  }
  ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, "", mn, 0, clOpen);
  if (ticket<0) {
    err=GetLastError();
    Print("Error(",err,") open ",GetNameOP(op),": ",ErrorDescription(err));
    Print("Ask=",Ask," Bid=",Bid," sy=",sy," ll=",ll,
          " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
  }
}
 

オンライン用のOpenPosition()関数です。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.03.2008                                                     |
//|  Описание : Открывает позицию и возвращает её тикет.                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//+----------------------------------------------------------------------------+
int OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
  color    clOpen;
  datetime ot;
  double   pp, pa, pb;
  int      dg, err, it, ticket=0;
  string   lsComm=WindowExpertName()+" "+GetNameTF(Period());
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell;
  for (it=1; it<=NumberOfTry; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
      Print("OpenPosition(): Остановка работы функции");
      break;
    }
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    dg=MarketInfo(sy, MODE_DIGITS);
    pa=MarketInfo(sy, MODE_ASK);
    pb=MarketInfo(sy, MODE_BID);
    if (op==OP_BUY) pp=pa; else pp=pb;
    pp=NormalizeDouble(pp, dg);
    ot=TimeCurrent();
    ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, lsComm, mn, 0, clOpen);
    if (ticket>0) {
      if (UseSound) PlaySound(NameFileSound); break;
    } else {
      err=GetLastError();
      if (pa==0 && pb==0) Message("Проверьте в Обзоре рынка наличие символа "+sy);
      // Вывод сообщения об ошибке
      Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);
      Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op),
            " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
      // Блокировка работы советника
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Длительная пауза
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66.666);
        if (ExistPositions(sy, op, mn, ot)) {
          if (UseSound) PlaySound(NameFileSound); break;
        }
      }
      if (err==140 || err==148 || err==4110 || err==4111) break;
      if (err==141) Sleep(1000*100);
      if (err==145) Sleep(1000*17);
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      if (err!=135) Sleep(1000*7.7);
    }
  }
  return(ticket);
}
 

OpenPosition()関数の使用例です。

1.現在の商品を0.1ロット購入する

OpenPosition(NULL, OP_BUY, 0.1);

2.EURUSDを0.2ロット売ります。

string sy="EURUSD";
double pa=MarketInfo("EURUSD", MODE_ASK);
double pb=MarketInfo("EURUSD", MODE_BID);
double po=MarketInfo("EURUSD", MODE_POINT);
OpenPosition(sy, OP_SELL, 0.2);

3.USDCADを0.12ロット、20ピップスで売ります。

string sy="USDCAD";
double pa=MarketInfo("USDCAD", MODE_ASK);
double pb=MarketInfo("USDCAD", MODE_BID);
double po=MarketInfo("USDCAD", MODE_POINT);
OpenPosition("USDCAD", OP_SELL, 0.12, pb+20*po);

4.USDJPYを0.15ロット、40ピップスで購入

string sy="USDJPY";
double pa=MarketInfo("USDJPY", MODE_ASK);
double pb=MarketInfo("USDJPY", MODE_BID);
double po=MarketInfo("USDJPY", MODE_POINT);
OpenPosition("USDJPY", OP_BUY, 0.15, 0, pa+40*po);

5.GBPJPYを0.1ロット売り、ストップ23、テイクアウェイ44ピップス。

string sy="GBPJPY";
double pa=MarketInfo("GBPJPY", MODE_ASK);
double pb=MarketInfo("GBPJPY", MODE_BID);
double po=MarketInfo("GBPJPY", MODE_POINT);
OpenPosition("GBPJPY", OP_SELL, 0.1, pb+23*po, pb-44*po);
トレーラーは、OpenPosition() 関数をテストするためのスクリプトです。最初の4つの例はコメントアウトされています。
ファイル:
 
KimIV:

オンライン用のOpenPosition()関数です。

//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 21.03.2008 |
//| Описание : Открывает позицию и возвращает её тикет. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента (NULL или "" - текущий символ) |
//| op - операция |
//| ll - лот |
//| sl - уровень стоп |
//| tp - уровень тейк |
//| mn - MagicNumber |
//+----------------------------------------------------------------------------+
int OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0) {
//-- skip --
string lsComm=WindowExpertName()+" "+GetNameTF(Period());
//-- skip --
関数のパラメータに lsComm を入れてはどうでしょうか。 例えば、こんな感じ。
int OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, string lsComm="", int mn=0) {
color clOpen;
datetime ot;
double pp, pa, pb;
int dg, err, it, ticket=0;

if (lsComm=="" || lsComm=="0") lsComm=WindowExpertName()+" "+GetNameTF(Period());
if (sy=="" || sy=="0") sy=Symbol();
イマイチ、機能の「柔軟性」が広がらない...。
 
Lukyanov писал (а):
関数のパラメータに lsComm を入れてはどうでしょうか。
イマイチ、機能の「柔軟性」が広がらない...。
気にしない...つまり、私はあなたがそれをすることを許可しているのです :-)
 
自分のためにやったんです。ただ、誰かにとっては便利かもしれません。:-)