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

 

kombat 2009年07月17日 22:13

合計すると、買い夏3ロットを取得し、このボリュームに対抗する3ロットを販売する

オプションとして、はい。ただし、すでに売りの注文がある場合は、EAが必要な注文を閉じないことがあります。解決するはずです。

kombat 2009.07.17 22:13.

しかし、ご質問にお答えすると、すべてのポジションをクローズすることは可能なのでしょうか?

そうですね、ひとつひとつ、クイックスクリプト、aap!で終わりですから......。

それが、今使っているものです。スクリプトのセット - これを使い、あれを使う...。しかし、Expert Advisorに自分のストラテジーをコード化しようとしたところ、いくつもの難題にぶつかりました。

 
gince >> :
私はここで動作しないものを持っている、それはそれはエラーなしを閉じないことを意味します。

ClosePositions()関数では、そのb-Positions.mqhライブラリ、KimIVはテスターでeeの使用を禁止するその他のClosePosBySelect()関数への呼び出しを使用しています 。

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;


ヒストリーテストには、彼のライブラリb-ForTest.mqhを 使用します。

 
BoraBo писал(а)>>

ClosePositions()関数では、そのb-Positions.mqhライブラリ、KimIVはテスターでeeの使用を禁止するその他の関数ClosePosBySelect()への呼び出しを使用しています。

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;

歴史テストには、彼のライブラリb-ForTest.mqhを 使用します。

あなたは私のコードを誤解している...ロシア語への翻訳...NOTテストモードかつ(EAが取引不可またはExpert Advisorが停止している)場合、ループを中断する。簡単に言うと、ツールバーの「Expert Advisors」ボタンを押したときに、この行でループから抜けるようになっています。

 
分かりにくくて申し訳ありません。
 

こんばんは。

残念ながら、配列にも矛盾があります...ロットが0より大きい場合(Lts>0)という条件でオーダーカウントした場合、ロットは1つずつ(利益が出た時点で)決済されますが、トータルの利益は考慮されるはずです。

   int Tip;                               // Тип ордера
   int Ticket=0,                          // Номер ордера
   Tkt;                                   // Количество номеров ордеров
   double Lot=0,                          // Количество закр. лотов
   Lts;                                   // Количество лотов всего
   double Price_Cls;                      // Цена закрытия ордера
   int Errors;
//--------------------------------------------------------------- 3 --

      for(int mm=1; mm<= Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам
        {
         if( Mas_Ord_Tek[ mm][6]== Tip &&     // Среди ордеров нашего типа
            Mas_Ord_Tek[ mm][5]> Lot &&      // .. выбираем лоты
            Mas_Ord_Tek[ mm][4]> Ticket)     // .. выбираем номер ордера
           {                              // Этот больше ранее найден.
            Lts= Mas_Ord_Tek[ mm][5]+ Lot;
            Tkt= Mas_Ord_Tek[ mm][4]+ Ticket;
           }
        }
      if ( Tip==0) Price_Cls=Bid;          // Для ордеров Buy
      if ( Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      if ( BuyOrdProf>100 && Lts>0)
      Ans=OrderClose( Tkt, Lts, Price_Cls,0,Red);// Закрыть все ордера

また、注文数の条件では、ロットが1以上(Lts>1)の場合、ロットはクローズされません。

   int Tip;                               // Тип ордера
   int Ticket=0,                          // Номер ордера
   Tkt;                                   // Количество номеров ордеров
   double Lot=0,                          // Количество закр. лотов
   Lts;                                   // Количество лотов всего
   double Price_Cls;                      // Цена закрытия ордера
   int Errors;
//--------------------------------------------------------------- 3 --

      for(int mm=1; mm<= Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам
        {
         if( Mas_Ord_Tek[ mm][6]== Tip &&     // Среди ордеров нашего типа
            Mas_Ord_Tek[ mm][5]> Lot &&      // .. выбираем лоты
            Mas_Ord_Tek[ mm][4]> Ticket)     // .. выбираем номер ордера
           {                              // Этот больше ранее найден.
            Lts= Mas_Ord_Tek[ mm][5]+ Lot;
            Tkt= Mas_Ord_Tek[ mm][4]+ Ticket;
           }
        }
      if ( Tip==0) Price_Cls=Bid;          // Для ордеров Buy
      if ( Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      if ( BuyOrdProf>100 && Lts>1)
      Ans=OrderClose( Tkt, Lts, Price_Cls,0,Red);// Закрыть все ордера

このエラーが表示される方を教えてください。

それとも、Igorさん、私があなたの機能の使い方を誤解しているのでしょうか?

BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); //関数を コールする。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в валюте депозита |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
  double p=0;
  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=="") && ( op<0 || OrderType()== op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( mn<0 || OrderMagicNumber()== mn) {
            p+=OrderProfit()+OrderCommission()+OrderSwap();
          }
        }
      }
    }
  }
  return( p);
}
 

Igorさん、PriceOpenLastPos関数をインジケータに挿入する方法を教えてください。

コンパイル時に、最初のブラケットとそれに続く変数でエディタがエラーを出します。

double PriceOpenLastPos( string sy="", int op=-1, int mn=-1) {
datetime t;
double r=0;
int 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();
r=OrderOpenPrice();
}.
}
}
}
}
}
}
return(r);
}.
}

'(' - 関数定義 unexpected D:\MT4﹑️ (627, 24)
'sy' - variable not defined D:\MT4﹑️ D:\MT4﹑️ (632, 7)
etc.

売買シグナル形成のロジックをインジケータに実装し、生成されたシグナルをグローバル変数 経由でExpert Advisorに送り、注文をオープン/クローズさせる。

何か判断するために注文の建値が必要なので、それをやろうとしています。私のインジケータは動的なもので、テスターのデモモードまたはビジュアライゼーションモードでのみデバッグが可能です。

 

トータルの利益ではなく、個々の注文の利益が考慮されるという図式です。

 
Angela, コンパイラは、私の関数定義がこの特別な場所にあるとは思ってもみなかったのです。それは、コードの上位のどこかに何かが欠けていることを意味します。セミコロンや閉じ中括弧が必要かもしれません。とにかく、コードをよく確認することです。
 
hope писал(а)>>
BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); //関数呼び出し

関数に渡すパラメータが正しくない。こんな感じでいいんじゃないでしょうか。

BuyOrdProf=GetProfitOpenBuyPosInCurrency("", OP_BUY);
 
KimIV >> :

関数に渡すパラメータが正しくない。こんな感じでいいんじゃないでしょうか。

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