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

 
alexpert007 >> :

そして、ここでもイゴールさんに質問です。

通常のOrderClose - OrderSendを使わずに、買いポジションと売りポジションを反転させるカスタム(または他の)関数を別途作成しましたか?

イゴールではありませんが、反転のためのOrderCloseBy 関数が標準で用意されています。

 

こんにちは、問題の解決に協力してほしいのですが。

オーダーをカウントする機能があります。

int OrdersAll(int mag)
{
int kolvo=0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if((OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber() == mag )
kolvo++;
} } {(OrderType()==Symbol() ==Symbol() && OrderMagicNumber() == mag )
}
return(kolvo);
}.

さらに、その過程で、現在のシンボルに注文がない場合、条件を満たしたときに、例えば買いの1注文を出すようにします。

if(OrdersAll(MAGICNO)==0)
{
if(condition)
{
op=Ask;if(SL>0){sl=Ask-SL*Point*mn;}if(TP>0){tp=Ask+TP*Point*mn;} ←クリックすると拡大します。
err=OrderSend(Symbol(),OP_BUY,LotsOptimized(),NormalizeDouble(op,Digits),3,NormalizeDouble(sl,Digits),
NormalizeDouble(tp,Digits),", MAGICNO,0,Blue);
if(err<0)
{
Print("OrderSend()- Error OP_BUY.Orders.注文を受け付けない。op "+op+" sl "+sl+" tp "+tp+""+GetLastError());return(-1);
}.
}
}

その代わり、ターミナルで複数のシンボルを開き、それぞれでEAを実行する場合、例えば上記のコードでは1つの注文を開くことができます - これは正しいのですが、同時に、数ティックの間条件が成立すれば、セイウチがなくなるまで20~30個の注文を開くこともできます。まだ1台の楽器で起きたことはありませんが、1台の楽器で起きないとも全く言い切れません。注文を1つ以上開けないようにするには、どのようにコードを修正すればよいのでしょうか。

 

イゴールさん、こんばんは。

あなたのファンクションコールを管理できない。

//+----------------------------------------------------------------------------+
//| 作成者 : Kim Igor V. aka KimIV,http://www.kimiv.ru||Google Play!
//+----------------------------------------------------------------------------+
| バージョン:2008年2月19日
//| 説明 : 預け入れ通貨でのオープンポジションの総利益を返します。
//+----------------------------------------------------------------------------+
//| パラメータ: |
//| 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) { (オーダータイプ()==OP_BUY)
if (mn<0 || OrderMagicNumber()==mn) {.
p+=OrderProfit()+OrderCommission()+OrderSwap()です。
}
}
}
}
}
return(p)です。
}

TotOrdProf=GetProfitOpenBuyPosInCurrency(EURUSD, ____, 1)のコールで、教えてください。

1.EURUSDの場合、"EURUSD "と引用符で囲むべきか、それとも囲まなくてもよいのか。

2.買いと売りの利益の合計を計算するための2番目の呼び出しパラメータ(ダッシュがあるところ)はどうあるべきか(私はデフォルトの-1を試しましたが、正しくありません)。

3. 3番目のパラメータはExpert Advisorのマジックナンバーですか?- まだ手をつけていないのですが、パラメータを正しく理解しているかどうかだけ質問です。

ありがとうございます。

 

TotOrdProf=GetProfitOpenBuyPosInCurrency("EURUSD",-1,-1)。

- EURUSDのみ

- すべてのオープンポジション(-1)

- の位置は、どんな魔法でも(-1)。

 

こんにちは。

ご存知のように、ターミナルテスターではSleep() が動作しないので、数学関数のループを使って実行を遅らせる必要があります。

if (IsTesting()==true){for(int z0 = 1; z0 < zFILE*10000; z0++){MathSqrt(MathPow(5,5));MathSqrt(MathPow(5,5));MathSqrt(MathPow(5,5));}}

ここで、zFILEはExpert Advisorの実行遅延時間です。

数秒から10-20分程度の遅延が必要です(外部プログラムによるデータ処理)ので、もっと洗練されたソリューションはないでしょうか?

少なくとも、より正確に実行時間を測定し(プロセッサの性能は異なるので)、最も遅いものをピックアップする方法は?





 
Piboli >> :

質問:数秒から10-20分の遅延が必要(外部ソフトウェアによるデータ処理)なので、もっとエレガントなソリューション(遅延機能)はないのでしょうか?

コールバックやシンクロナイザーを使ってみませんでしたか?

 

キムの機能

最後のパターンの名前を引っ張ってくる機能はないだろうか

と、その構成要素の変化を記録する


 

KimIVは 、多分できるだろうし、インジケータを書く

インジケータは、指定された期間内に、設定で指定されたよりも広くないフラットチャネルを検索する必要があります。

このインジケータは、isTradeTimeInt()関数のように、1日中と翌日への移行の両方でチャネルを検索する必要があります。
このインジケータは、1日に5チャンネル描画することも、1チャンネルだけ描画することも可能です。
設定において

extern double 最大チャンネルの高さ (ポイント)
extern int Bar_Time バー(1)または時間と分(2)で時間間隔を計算する方法
extern string チャネルの最小時間間隔(時間および分)。
extern int int チャネルの最小時間間隔 (バー)
extern int 描画されたままのチャンネルの最大数

https://www.mql5.com/ru/code に似たようなインジケータを付けていますが、厳密に設定された時間間隔でチャネルを描画し、自らそのようなチャネルを探すことはしていません。チャンネルの最大高さを超えず、チャンネルの最小時間間隔より短くないものだけを探す必要があります。
チャンネルの時間にBar_Timeを選択した場合、チャンネル(1)は現在の時間から設定で指定した時間、つまり2時間15分または別の時間を引いた時間から計算されます。 現在が1時間15分なら、23時間00分から最大と最小を探して、最大と最小がチャンネルの最大高さを下回るなら、23時から02時15分の最大と最小の2ラインを描画するのです。また、チャネルの上下にフィボレベルを描画します。

Bar_Time by number of bars を選択した場合、現在のバーから設定で指定したバーの数を引いたもの、つまりゼロバーから設定で指定した数を引いたものまでがチャンネルとして計算されます。選択された数字が50の場合、ゼロバーから過去50バーの高値と安値を検索し、高値から安値を引いた値がチャンネルの最大高さを上回らなければ、50バーの高値と安値の2本のラインが描画されます。

すべてのレベルとチャンネルデータはバッファに格納されます。

 

イゴールへの質問

あなたは私に2つの別々のアカウント(売買)で動作するExpert Advisorのコードの断片を与えることができれば、各アカウントの状態を(ロットサイズを計算する)ポーリングと1アカウントから別のアカウントに預金を転送する機能を持つだけでなく、特定の条件の下で預金の一部の撤退をシミュレート(毎月または四半期の利益を言う - それからn%)。

私の質問を明確にさせてください

1 Expert Advisor は買い(アカウント 2 のポール状態)で動作します。6200

2 Expert Advisor が売りポジションをオープン(口座残高を 1 に要求) ...8400

募集職種がない場合

アカウント2からアカウント1へ1100

アカウント1 - 7300

アカウント2 - 7300

総預金額 SD=14600 最大リスク-10% 最大ロット0.14

さらに

09年4月1日現在 SD=10000

2009年7月1日現在 SD=14600

利益=4600

10% = 460

第3アカウントで460ドル引き落とし

ありがとうございました。

 

イゴール様、助けてください!

a-SimpleTrailing.mqhを 接続しました。

指定されたものを追加しましたが、3つのエラーがポップアップして います。

'clModifyBuy' - 変数が定義されていない
'clModifySell' - 変数が定義されていない
'ti' - 変数が既に定義されている

どうしよう(


)


適合するのはこちらです。

.........................
   total=OrdersTotal();
   if( total<1)
     {
      if(AccountFreeMargin()<(1000* Lots))
        {
         Print("У вас нет денег. Свободные средства = ", AccountFreeMargin());
         return(0);
        }
      if(Hour()>=0)
        {
         chk=1;
         Print("Позиция возможна!");
        }
      if( chk==1)
        {
         if((Low[0]<= MaDert1sell) || (Low[0]<= MaDert2sell))
           {
int ti= OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect( ti, SELECT_BY_TICKET))
ModifyOrder(-1, Ask-30*Point, Bid-99*Point, clModifySell);
            if( ticket>0)
              {
               if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
                  Print("Открыт ордер SELL : ",OrderOpenPrice());
               chk=0;
              }
            else
              {
               Print("Ошибка открытия SELL ордера : ",GetLastError());
               return(0);
              }
           }
         if((High[0]>= MaDert1buy) || (High[0]>= MaDert2buy))
           {
int ti= OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect( ti, SELECT_BY_TICKET))
ModifyOrder(-1, Ask-30*Point, Bid-99*Point, clModifyBuy);
            if( ticket>0)
              {
               if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
                  Print("Открыт ордер BUY : ",OrderOpenPrice());
               chk=0;
              }
            else
              {
               Print("Ошибка открытия BUY ордера : ",GetLastError());
               return(0);
              }
           }
        }
      return(0);
     }
   for( cnt=0; cnt< total; cnt++)
     {
      OrderSelect( cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // это открытая позиция? OP_BUY или OP_SELL 
         OrderSymbol()==Symbol())  // инструмент совпадает?
        {
         if(OrderType()==OP_BUY)   // открыта длинная позиция
           {
            // проверим, может уже пора закрываться?
            if(Hour()==23)
              {
               chk=0;
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
               return(0); // выходим
              }
           }
         else // иначе это короткая позиция
           {
            // проверим, может уже пора закрываться?
            if(Hour()==23)
              {
               chk=0;
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // закрываем позицию
               return(0); // выходим
              }

           }
        }
     }
   return(0);
  }

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Модификация одного предварительно выбранного ордера.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена установки ордера                                              |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    cl - цвет значка модификации                                            |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE) {
  bool   fm;
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
 
  if ( pp<=0) pp=OrderOpenPrice();
  if ( sl<0 ) sl=OrderStopLoss();
  if ( tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble( pp, dg);
  sl=NormalizeDouble( sl, dg);
  tp=NormalizeDouble( tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);
 
  if ( pp!= op || sl!= os || tp!= ot) {
    for ( it=1; it<= NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, 0, cl);
      if ( fm) {
        if ( UseSound) PlaySound( NameFileSound); break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(", er,") modifying order: ", ErrorDescription( er),", try ", it);
        Print("Ask=", pa,"  Bid=", pb,"  sy=",OrderSymbol(),
              "  op="+ GetNameOP(OrderType()),"  pp=", pp,"  sl=", sl,"  tp=", tp);
        Sleep(1000*10);
      }
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Возвращает наименование торговой операции                                 |
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
	switch ( op) {
		case OP_BUY      : return("Buy");
		case OP_SELL     : return("Sell");
		case OP_BUYLIMIT : return("Buy Limit");
		case OP_SELLLIMIT: return("Sell Limit");
		case OP_BUYSTOP  : return("Buy Stop");
		case OP_SELLSTOP : return("Sell Stop");
		default          : return("Unknown Operation");
	}
}
//+----------------------------------------------------------------------------+