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

 
Expert Advisor e-CloseByPercentProfit.mq4 に、インストールしたチャートのペアで TP と SL を設定する機能を追加することは可能ですか?
 

皆さん、こんにちは。

機能に関する質問


//+------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                        |
//|  Описание : Возвращает количество позиций.      |
//+------------------------------------------------------------------+

int NumberOfPositions(string sy="", int op=-1, int mn=-1){
  int i, k=OrdersTotal(), kp=0;  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++)                                    {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()== sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op)                   {
            if ( mn<0 || OrderMagicNumber()== mn) kp++;
          }}}}}  return( kp);}  
          

多通貨の相手先がある。ペアは外部パラメータに設定されます。専属マジシャン付き(各組)。


if ( NumberOfPositions(Symbol_1, -1,Magic_1)<1){//если нет открытых
//позиций по 1-му инструменту, 
OR (for the second pair)
if ( NumberOfPositions(Symbol_2, -1,Magic_2)<1){//если нет открытых
//позиций по 2-му инструменту, проверяем ОСТАЛЬНЫЕ условия

何が起こったかというと、昨日両方のシンボル - EURUSD - をチャージしたところ、今朝、両方のケースでシグナルが出ているように見えたのに、1つのトレードしか開かなかったのです。

そして、ふと思ったのです。その機能は

NumberOfPositions(string sy="", int op=-1, int mn=-1)
まず、あるシンボルに対してオープンポジションが あるかどうかを確認します。そして、それ以外のすべて。

つまり、EIRUSDのEAでオープンポジションを持っている場合、別の アルゴリズムに従った別のマジックを使っても 、2つ目のポジションはオープンしないのです。

どうか、事実かどうか教えてください。

それとも、私の推論が誤っているのでしょうか? それとも、この関数はすべての条件を1つずつ 評価するのでしょうか?


 

私はこの関数をよく使いますが、入力されたパラメータに従ってすべてを返してくれます。関数が通過する項目は、パラメータに従って順次ソートされる。ご自身の目でお確かめください。

int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()== sy || sy=="") { //далее внутри символа
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) { //далее внутри типа ордера
            if ( mn<0 || OrderMagicNumber()== mn) kp++; //внутри магика, и только здесь позиция учтена 
          }
        }
      }
    }
  }
  return( kp);
}
 

つまり、私のEAは、最初のポジションが開いている限り、別のマジシャンを使ってでも、2つ目のEURUSDのポジションを開くことができないということですか?

どうやらそうらしい。テスターでも位置が重なると見えないようですから。

//--------------------------------------------------------

 
Rita >> :

ということは、私のEAでは、1つ目のポジションが開いている間は、別の魔術師がいても2つ目のEURUSDのポジションは開けないということでしょうか。

まさにその逆 :)) この機能は、記号とマジックナンバーを別々にカウントすることを意味します。つまり、EURUSDにMagic_1のオープンポジションがある場合、NumberOfPositions("EURUSD", -1, Magic_2)==0; ただしEURUSDにMagic_2の他のポジションがある場合は除きます。

一般に、この関数は(sy && op && mn)に従ってオープンポジションをカウントします。つまり、ポジションはこれらのパラメータで正確にカウントされます。少なくとも1つのパラメータが一致しない場合、この関数では注文は考慮されず、表示されない。

関数の値をCommentで印刷すれば、注文数や関数が正しく動作しているかどうかをリアルタイムで確認することができます。アルゴリズムが誤動作する原因は、EAコードにある可能性が高いです。

 
なるほど。今、コードを確認します。
 
hope писал(а)>>

関数呼び出しのシンボルにバインディングを追加しても、解決しません。なぜ、各ポジションの利益を別々にカウントするのですか(上の写真)?

いや、むしろ私の絵を差し出したいくらいだ...。

...そして台本...

 
KimIV писал(а)>>

いや、むしろ私の絵を差し出したいくらいだ...。

...そして台本...

自分が馬鹿だと気づいた...。牛肉と牛乳を足しても乳房はできない。

 
KimIV писал(а)>>
アンジェラ、コンパイラは私の関数定義がまさにこの場所で見つかるとは思ってもみなかったんだ。これは、コードの上のどこかに何かが欠けていることを意味します。セミコロンや閉じ中括弧であってもよい。とにかく、コードをよく確認することです。

私はそれを理解した、私はちょうどint start()の中にあなたの関数を挿入し、私はint start()の外にそれを置くと、すべてがコンパイルされました。問題は別で、テスターの可視化モードのインジケーターでは、この関数がEAからインジケーターにデータを取得しないのです。

 
e-News-Lucky$.mq4

Lucky$ & KimIV

http://www.kimiv.ru

イゴールさん、こんにちは。

Expert Advisorを使用していますが、とても良いです。昨日、iCustomを通して インジケータを添付しようとしましたが、表示されませんでしたが、 iCustomを通して 処方する方法は?iHighや iLowの ようなビルドイン機能は問題なく表示されるのに、インジケータ経由の保留注文は拒否されるのはどういうことだろう。

日足の iHighとiLowに対してこのように設定しました。 この 関数は期待通りに動作し、保留注文を出しますが、インジケータ(((....このEAでインジケータを使用して、どのように保留中の注文を置くか、コードの断片を表示したいのですが? インジケータは iCustom 関数の呼び出し以外 でもかまいません。

お時間があれば、よろしくお願いします。

//глобальные переменные

double Hi_Bar;
double Lou_Bar;

//+------------------------------------------------------------------+
//| Установка ордеров                                                |
//+------------------------------------------------------------------+
void SetOrders() {
  Hi_Bar  = iHigh(Symbol(), PERIOD_D1, 0);
  Lou_Bar =  iLow(Symbol(), PERIOD_D1, 0);
  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double pAsk= Hi_Bar+( DistanceSet+ spr)*Point;
  double pBid= Lou_Bar- DistanceSet*Point;