[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 192

 
artmedia70:
イゴール・キムは、一定期間ごとに以下のことを行うアドバイザーをつけて います。


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

こんにちは。

保留中の注文、特に有効期限に関する問題。

   ticket=OrderSend(symb, OP_SELLLIMIT, Lots, price, Slippage, 0, 0, lsComm, mn, TimeCurrent() + 60*60, op_color);

このように、新しい注文は、1時間以内にトリガーされなかった場合、サーバーはそれを閉じる必要があります。

そして、賞味期限を確認します。

   if (ticket>0)
   {
    OrderSelect(ticket, SELECT_BY_TICKET);
    Alert("OrderExpiration = ", TimeToStr(OrderExpiration(), TIME_DATE),":",TimeToStr(OrderExpiration(), TIME_MINUTES)); 
.......
   } 

テスターでEAを動作させるとこのようになります。

2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: open #1sell limit 2.00 EURUSD at 1.27972 ok
2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: Alert:OrderExpiration = 2012.01.11:12:00
2013.03.01 12:45:58 2012.01.12 16:29 Tester: 注文 #1, sell 2.00 EURUSD is opened at 1.27972.

つまり、有効期限の日付と時刻は私が望むように正しく設定されていますが、有効期限の時刻にクローズがありません - ポジションは24時間後に開かれます。

いくつかのフォーラムを検索してみましたが、問題は発生します。通常の回答は、「自分ではうまくいっている」または「保留中の注文を自分で追跡する」です。自分で追跡するのは嫌なので、私には効果がありません。

 
artmedia70:
イゴール・キムは、一定期間ごとに以下のことを行うアドバイザーをつけて います。

効果絶大です。

ご指摘ありがとうございます。

 
DhP:

効果絶大です。

ご指摘ありがとうございます。


私ではなく、Googleです。

そこから自分で保存画面の機能を引っ張ってきて、自分でパラメータを設定して呼び出せばいいと思うのですが......手抜きすぎましたね。

 
borilunad:
セルゲイさん!明日、あなたのテストEAにさらにいくつかの関数を挿入して、きれいな実験を行う予定なので、関数についての質問はとりあえず保留にしておきます。ビジュアルモードで見ていますが、ほぼ全てのダブルクローズは最後、それ以前のものはSLとTPでクローズ、つまり選ぶものがないのです。選択できるようにするため、Stop and Takesを削除しました。明日は、このExpert Advisorに追加された機能とコメントをご紹介します。機能がどのように働くのか、ご自身の目で確かめてください。私が間違っていたことを示すために、本当に欲しいのです当たっていれば、頑張ります!では、また明日

セルゲイ ドゥバキン 目視で確認したところ、この機能は最大値を選択するもので、私が必要としていたのはこれでした。迷いがなくなってよかったです!お詫び申し上げます。しかし、私たちのビジネスでは、「7回測ったほうがいい」のです......。機能チェックのためのテスターEAに、機能とコメントを追加して見せることで、より明確なビジュアルチェックを実現!ありがとうございました。

extern int EA_Magic=135; // внешняя переменная

int TimeNow, TimePrev, PrevType; // глобальные переменные

int start()
{
  double Price,SL,TP;
     int Ticket;

  TimeNow=iTime(NULL,240,0);
  if(TimePrev==TimeNow) return(0);

  if(PrevType!=1) {
   Price=NormalizeDouble(Ask,Digits);    
//   SL=NormalizeDouble(Price-300*Point,Digits);    
//   TP=NormalizeDouble(Price+300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_BUY,0.1,Price,3,0,0,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=1; } }

  else if(PrevType!=-1) {
   Price=NormalizeDouble(Bid,Digits);    
//   SL=NormalizeDouble(Price+300*Point,Digits);    
//   TP=NormalizeDouble(Price-300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_SELL,0.1,Price,3,0,0,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }

  Comment("BuyPos: ",NumberOfBuyPositions(),"; SellPos: ",NumberOfSellPositions(),
  "; LotPos: ",GetAmountLotFromOpenPos(),
  "\nMaxLoss: ",DoubleToStr(GetMinProfit(),2),"; MaxProf: ",DoubleToStr(GetMaxProfit(),2),
  "\nLossDiff: ",DoubleToStr(GetMinProfit()+GetMaxProfit(),2));

  if(Hour()==0 && TimePrev==TimeNow) LockOFF(EA_Magic);

  return(0);
}

bool LockOFF(int EA_Magic) {
  double Result, PrevLoss, PrevProfit;
     int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
    bool Ans;

  MaxProfitTicket=-1; MaxLossTicket=-1;

  orders_total=OrdersTotal();
  for(pos=orders_total-1; pos>=0; pos--) {
    if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
    if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
    if(OrderType()>1) continue;
    Result=OrderProfit()+OrderSwap()+OrderCommission();
    if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
      PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType();  // end of for
  } }
  if(MaxLossTicket==-1) return(false); // нет убыточной позиции
  if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

  orders_total=OrdersTotal();
  for(pos=orders_total-1; pos>=0; pos--) {
    if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
    if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
    if(order_type!=OrderType()) continue;
    Result=OrderProfit()+OrderSwap()+OrderCommission();
    if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
      PrevProfit=Result; MaxProfitTicket=OrderTicket();  // end of for
  } }
  if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

  Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
  if(!Ans) { 
    Print("Ошибка при встречном закрытие!"); return(false); 
  }
  return(true); 
}
//+----------------------------------------------------------------------------+
int NumberOfBuyPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY) {
        if (op<0 || OrderType()==op) {
          kp++;
  } } } }
  return(kp);
}
//+----------------------------------------------------------------------------+
int NumberOfSellPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          kp++;
  } } } }
  return(kp);
}
//+----------------------------------------------------------------------------+
double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
  double l=0;
  int    i, k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          l+=OrderLots();
  } } } }
  return(l);
}
//+----------------------------------------------------------------------------+
double GetMinProfit(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          if (p>OrderProfit()+OrderCommission()+OrderSwap())
          p=OrderProfit()+OrderCommission()+OrderSwap();
  } } } }
  return(p);
}
//+----------------------------------------------------------------------------+
double GetMaxProfit(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          if (p<OrderProfit()+OrderCommission()+OrderSwap())
          p=OrderProfit()+OrderCommission()+OrderSwap();
  } } } }
  return(p);
}
//+----------------------------------------------------------------------------+
 
borilunad:

セルゲイ ドゥバキン 目視で確認したところ、この機能は最大値を選択するもので、私が必要としていたのはこれでした。迷いがなくなってよかったです!お詫び申し上げます。しかし、私たちのビジネスでは、「7回測った方がいい」のです...。機能チェックのためのテスターEAに、機能とコメントを追加して見せることで、より明確なビジュアルチェックを実現!ありがとうございました。

どうしてそうなのか...。イゴール・キムが作ったものをベースに...。たった一つの特徴...他は同じです。

//+----------------------------------------------------------------------------+
int NumberOfBuyPositions(string sy="", int op=-1, int mn=-1) { // для чего присвоены значения по-умолчанию, если они нигде не используются? Кроме op (и то неверно)
  int i, k=OrdersTotal(), kp=0;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY) {                               // тут жесткая проверка на тип Buy
        if (op<0 || OrderType()==op) {                         // тут лишняя проверка на значение op, используемое по умолчанию и ещё одна лишняя проверка на ==op
          kp++;
  } } } }
  return(kp);
}
//+----------------------------------------------------------------------------+

といったところでしょうか。

//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy, int op, int mn) {
  int i, k=OrdersTotal()-1, kp=0;
  for (i=k; i>=0; i--) {
   if (OrderSelect(i,SELECT_BY_POS)) {           // если ордер выбран
      if (OrderMagicNumber()!=mn)   continue;    // если не наш магик - смотрим следующий ордер
      if (OrderSymbol()!=sy)        continue;    // если не наш символ - смотрим следующий ордер
      if (OrderType()!=op)          continue;    // если не соответствует тип - смотрим следующий
      kp++;                                      // тут искомый ордер - увеличим счётчик
      }
   }
  return(kp);
}
//+----------------------------------------------------------------------------+

そして、彼女を呼び出す。

現在のシンボルで買いと売りをカウントするために、Magic

//+----------------------------------------------------------------------------+
   int BuyPos= NumberOfPositions(Symbol(), OP_BUY,  Magic);
   int SellPos=NumberOfPositions(Symbol(), OP_SELL, Magic);
//+----------------------------------------------------------------------------+
 
alsu:
pasha5282:
すべてのオープントレードの中から最小ロットを選択する方法を教えてください。

int i, ot = OrdersTotal();
double min=0;
int min_ticket=0;
for(i=0;i<ot;i++)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
if(i==0||min>OrderLots()){min = OrderLots(); min_ticket=OrderTicket();}
}


スレッドを拝見させていただきました。あなたの論理はおかしいです。最後の1行のコードに興味があります。

if(i==0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();
変数iは ループの最初だけ値0に なる。さらに、反復するごとに1ずつ 値を追加していく。

そして、ループを継続させるための条件があります。

min>OrderLots()
しかし、minは ゼロとして宣言され、その値はコードの他のどこでも変わりません。つまり、この値が真に なることはないのです論理はどこにあるのか?
 
hoz:


スレッドを拝見させていただきました。あなたの論理はおかしいです。最後の1行のコードに興味があります。

変数iは ループの最初だけ値が0に なる。さらに、1 回繰り返すごとに1ずつ 価値を高めていきます。

そして、そのサイクルを継続させるための条件がある。

しかし、minは ゼロと宣言されており、その値はコードの他のどこでも変わることはない。つまり、この値が真になることはないのです論理はどこにあるのか?

int i, ot = OrdersTotal();
double min=0.0;
int min_ticket=0;
for(i=0;i<ot;i++)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
if(min==0.0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();}
}
このようにすれば、不思議なことはすべてなくなるはずです。
 
hoz:


枝の間から覗いてみました。あなたの論理はおかしいです。最後のコード行に興味があります。

変数iは ループの最初だけ値0を 持つ。さらに、1 回繰り返すごとに1ずつ 価値を高めていきます。

そして、そのサイクルを継続させるための条件がある。

しかし、minは ゼロと宣言されており、その値はコードの他のどこでも変わることはない。つまり、この値が真になることはないのです論理はどこにあるのか?

ご注意ください

if(i==0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();

min>OrderLots()であれば、min = OrderLots()とする。

 
r772ra:

ご注意ください

min>OrderLots()であれば、min = OrderLots()とする。

minが0であれば、OrderLots()よりも大きくなることはない。