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

 
aceventura:

EAはペアごとに異なる設定になっているため、注文数機能は使えません。そして、注文は同時に異なるペアに設定されます。そして、2つのペアで4つの注文が出され、1つのトリガーがかかった場合、そのうちの3つが削除され、反対の1つはすべてのペアで削除されるはずです。

KimIVのすべての機能は、タイプ+ペア+マジックで注文を「フィルタリング」します。すなわち(自分にとって!:) 実行して検索しない - このページから "SecondsAfterCloseLastPos(string sy="", int op=-1, int mn=-1)" ) を呼び出して "Count there some" を実行する。この通貨ペアで、あるいはこのEAで、実際に開いた注文を取得することは確実です。

ZS 関数のことです

int NumberOfOrders(string sy="", int op=-1, int mn=-1)

12ページより

 
SergNF:

KimIVのすべての機能は、タイプ+ペア+マジックでオーダーを「フィルタリング」します。すなわち(私に!:) 実行して検索しない - このページから "SecondsAfterCloseLastPos(string sy="", int op=-1, int mn=-1)" ) を呼び出して "Count there some" を実行する。このペアで、あるいはこのEAで、実際の未決済注文数が得られることは確かです。

私が言いたかったのは、関数

12ページより

ありがとうございました。とても参考になりました調べてみるよ。

 
乱入のお詫び Help for Dummies MT4で平行線を素早く快適に引く方法とは?
 
extern double Lots = 0.1;
extern double TrailingStop = 10;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2;
   double P_up0,P_down0,P_up1,P_down1;
   int cnt,ticket,total;
 
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   P_up0=iCustom(0,0,"Ценовой канал",5,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",5,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",5,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",5,1,1);
   ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1);
   ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1);
   ao1=iAO(0,0,1);
   ao2=iAO(0,0,2);
   ac1=iAC(0,0,1);
   ac2=iAC(0,0,2);
//задали все данные 
 
   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if(P_down1>P_down0)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
            // условие закрытия короткой позиции
            if(P_up1<P_up0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
よろしくお願いします。トレーリングストップを使った簡単なEAを組んでみました。

トレーリングストップを一旦+5pipsして、それ以上振り込まないようにする方法、決済は

トレーリングストップがすでに設定されている場合、どのように使用するのですか?例を挙げるとすれば!!!
 
KimIV писал (а)>>

たぶん、ないと思います...。人差し指とグリップの2つしかないんですけど...。>>へー

イゴール、私はゲイではないけれど、あなたに片思いしています。なんといっても、ザドルノフとして働くこともできるのですから。

 

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

この関数は、最後にポジションが開かれてからの秒数を返す。考慮する位置の選択は、外部パラメータで設定します。

  • sy- 市場商品の名前。このパラメータが設定されている場合、この関数は指定された楽器の位置のみを考慮します。デフォルト値である」は、あらゆる市場商品を意味する。NULL 値は、現在の測定器を意味する。
  • op- 貿易業務、ポジションタイプ。有効な値:OP_BUYOP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子,MagicNumber.デフォルトの値である- 1は、任意の識別子を意味する。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после открытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  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) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}
P.S. SecondsAfterOpenLastPos()関数をテストするスクリプトを添付します。
ファイル:
 

もちろん野暮なことは言わない、あなたがやっていることは確かに良いことだ。

でも、どうやるかは、まったく好きではありません。

1.変数名を記述している点は素晴らしいが、毎回ヘッダーで次の野暮ったい略語の意味を確認する必要があり、その変数が何を表しているのかが分かりにくく、コードの中で何を調べたかったのか忘れてしまうこと。コメントなしでも英語のわかる人が理解できるような、質の高いセルフ・ドキュメント・コードは書けないのでしょうか。特にあなたは他人のためにやっているのですから、この質の高い人ならコードに間違いがあったとしても決して見つけることはできないでしょう。



2.オーバーロードされた関数。汎用性はBAD、機能のパラメータが6個は多すぎる。



3.コードの簡略化

datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();
 
  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) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}

これがあなたのコードです。どんなことができるのか、見てみましょう。

datetime SecondsAfterOpenLastPos(string symbol = "", int type = -1, int magic = -1) 
{
  datetime nearestTime = 0; // Инициализировать не надо? Самые сложно находимые ошибки.
  int count = OrdersTotal();
 
  if (symbol == "0") 
     symbol = Symbol();
 
  for (int i = 0; i < count; i++) 
  {
     // invalid select    
     if (!OrderSelect(i, SELECT_BY_POS)) continue;
     
     // not needed symbol     
     if (OrderSymbol() != symbol && symbol != "") continue;
 
     int currentType = OrderType();
 
     // only active orders are checked     
     if (currentType != OP_BUY && currentType != OP_SELL) continue;
     
     // type doesn't pass     
     if (type > 0 && currentType != type) continue;
 
     // magic number doesn't pass     
     if (magic > 0 && OrderMagicNumber() != magic) continue;
 
     if (nearestTime < OrderOpenTime()) nearestTime = OrderOpenTime();
  }
 
  return (TimeCurrent() - nearestTime);
}

コードを比較してみようか?同じことをするのです。

1.確かに私のコードは大きくなりましたが、何しろフロッピーディスクの時代ではありませんから、容量が足りないのでしょうか?

2.私のコードは、中身がより明確になっています。貼り付けられたコメントを抜きにしても。

3.あなたの関数はネスト7、私の関数はネスト2ですが、違いはあるのでしょうか?

4 オーバーロードしていない数少ない機能だが、開く、修正するなどは悪夢である。



SZZH:書いている人を尊重すること。

 

Но КАК вы это делаете, мне абсолютно не нравится.

-1.不一致です。形も内容も、すべてにおいて絶対に大丈夫です。全く 同じフォーマットで続けてください。

はい、私のコードの方が大きいです。

その通りです。そして、コードが小さいほど読みやすくなります。2-3画面でフォントが「にじむ」のが嫌だ。機能は、めくることなく、1つの画面で全て完結していることが望ましい。だから、私はコンパクト化に賛成なのです。

あなたの関数はネスト7、私は2ですが、違いはあるのでしょうか?

ところで、オプションのコンティニュアスがたくさんあって、それがまた読者の注意を引いてしまうのですが、大丈夫でしょうか?

 
Andrei(TheXpert) 様、コメントとご提案をありがとうございました。どれも絶対公平で、あなたの発言は絶対正しい!
 

DeleteOppositeOrders()関数。

この関数は、op パラメータで指定されたポジションの反対側の注文を1つまたは複数削除します。 例えば、買い ポジションの場合、反対側の注文はSellLimitと SellStopに なります。例えば、2つの反対注文が設定され、そのうちの1つがトリガーされた場合、反対注文の削除が必要となる。

  • sy- 市場商品の名前。このパラメータを設定すると、この関数は指定されたシンボルの位置だけを考慮するようになります。初期値」は、あらゆる市場商品を意味する。NULL 値は、現在の測定器を意味する。
  • op- 貿易業務、ポジションタイプ。有効な値:OP_BUYOP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子,MagicNumber.デフォルトの値である- 1は、任意の識別子を意味する。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.06.2008                                                     |
//|  Описание : Удаление ордеров, противоположных позиции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void DeleteOppositeOrders(string sy="", int op=-1, int mn=-1) {
  bool eb, es;

  switch (op) {
    case OP_BUY : eb=ExistPositions(sy, OP_BUY , mn); break;
    case OP_SELL: es=ExistPositions(sy, OP_SELL, mn); break;
    default:      eb=ExistPositions(sy, OP_BUY , mn);
                  es=ExistPositions(sy, OP_SELL, mn); break;
  }

  if (eb) {
    DeleteOrders(sy, OP_SELLLIMIT, mn);
    DeleteOrders(sy, OP_SELLSTOP , mn);
  }
  if (es) {
    DeleteOrders(sy, OP_BUYLIMIT, mn);
    DeleteOrders(sy, OP_BUYSTOP , mn);
  }
}
DeleteOppositeOrders()関数をテストするスクリプトを添付しています。
ファイル: