どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 103

 
hoz:

もし7時43分になっても寝なかったら...。ということは、スペルはgrailなんでしょうかね!?

いや、そんな悪態をつく必要はない :))ユセフから聖杯を もらった。スーツケースの中で、天からのマナを待っています!モルディブに行きます! :))

 
artmedia70:
だから、あなたが何をしたのか見せてください...。テレパスはいないよ、休暇中だから。

extern string time1 = "n";// 
extern string time2="m";
extern double lot=0.2;// объявили лот
extern int slippage=2;// объявили макс отклонение от цены





int start()
{
double max;// максимальная цена 6-ти свечей
double min;// минимальная цена 6-ти свечей
int hour1 = TimeHour(StrToTime(time1)); // время часы
int minute1 = TimeMinute(StrToTime(time1));// время минуты


if (hour1 == TimeHour(TimeCurrent()) && minute1 == TimeMinute(TimeCurrent()))// если время подошло то
{
min=Low[iLowest(Symbol(),0,MODE_LOW,6,1)]; // вычисляем минимальную цену последних 6 свечей
max=High[iHighest(Symbol(),0,MODE_HIGH,6,1)]; // вычисляем максимальную цену последних 6 свечей
double volum=max-min;// общий объем локалки последних 6 свечей М5
 int ticket1=-1;
 int ticket2=-1;
if ((volum<=0.0018)==true)// если объем свечей меньше или равно z пунктов 

if (ticket1<0)
{ 
OrderSend ( Symbol (), OP_BUYSTOP, lot,max+Point,3,min-Point,max+0.0022, NULL,0,time2, Red);
Alert(GetLastError());
}
if(ticket2<0)
{
OrderSend( Symbol (), OP_SELLSTOP, lot,min-Point,3,max+Point,min-0.0022, NULL,0,time2, Yellow);
Alert(GetLastError());
}


return;


if (OrderSelect(1,SELECT_BY_POS,MODE_HISTORY)) ///если первый открытый ордер закрылся с профитом 
if(OrderProfit()>0)
{
OrderDelete(OrderTicket());// удаляем второй отложенный
}

}



bool closeorder;//определим переменную закрытия ордеров
closeorder=true;

if (closeorder==true)// вечернее закрытие всех отложенных ордеров, и рыночных позиций
{
int hour2 = TimeHour(StrToTime(time2));// вычисляем время закрытия ордеров
int minute2 = TimeMinute(StrToTime(time2));

if (hour2 == TimeHour(TimeCurrent()) && minute2 == TimeMinute(TimeCurrent()))// если время ***
{// определяем количество открытых позиций, и отложенных ордеров
for(int i=OrdersTotal()-1; i>=0; i--)
 if (OrderSelect(1,SELECT_BY_POS,MODE_TRADES))break; //определяем место где будем искать ( рабочие позиции)
if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);// Закрытие ордера бай если такой есть
if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);//Закрытие ордера селл если такой есть
if (OrderType()==OP_BUYSTOP)
{ 
OrderDelete(OrderTicket()); //удаляем отложенный байстоп
}                    
if(OrderType()==OP_SELLSTOP)
{ 
OrderDelete(OrderTicket()); //удаляем отложенный sellstop
}                    

Expert Advisorの一般的なコードをアップロードして、何をすべきかを明確にしました。)
どこがバカなのか、もう一度教えてあげよう
保留中の注文を開く: 1つの保留中の注文を反対側の注文なしで開くか、または一方向の保留中の注文をすべて開きます。
それは、注文を削除します:時には明確に指定された時間に夕方に大丈夫、そして時には一日で、または全く閉じない...

さて、その条件とは.
1つ目の未決済注文が利益で決済されると、2つ目の注文はすぐに削除されます。正しく記述できているか疑問ですが、2つの反対ポジションを持ちたくないので、実際に確認できません=(((
 
artmedia70:
最後に閉じた注文を検索するとき、まず最も最近閉じた注文を見つけるべきですが、takeで閉じるかどうかのチェックはループの外に移動させるべきです。そうしないと、閉じた注文ごとにtakeで閉じるかどうかをチェックし、もしそうなら、最新の注文ではなく、ループ内の最初にtakeで閉じた注文の時刻を記憶します。


まあ、これはコードの最適化な んですけどね。結果は変わらない、と思っています。ただ、計算には時間がかかります。コードを直しましたが、やはり同じです。

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
datetime GetLastOrderState()
{
   datetime lastOrderCloseTime = -1,               // Время закрытия последнего открытого ордера
            lastOOTMarket = -1,          // Время открытия последнего открытого ордера рыночного
            lastOOTHist = -1;            // Время открытия последнего открытого ордера из истории
   
   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют..
  
      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
          lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
      Comment("Время закрытия последнего ордера в истории lastOrderCloseTime = ", lastOrderCloseTime);
   }

   if (MathAbs(OrderTakeProfit() - OrderOpenPrice()) < i_tp * pt) return(0);
      Comment("OrderTakeProfit() - OrderOpenPrice() < i_tp * pt = ", MathAbs(OrderTakeProfit() - OrderOpenPrice()) < i_tp * pt);
   lastOOTHist = OrderOpenTime();   // Тогда время открытия последней закрытой позиции из истории
      Comment("Время закрытия последнего ордера в истории lastOOTHist = ", lastOOTHist);
   
      Comment("Время открытия последнего открытого ордера = ", lastOOTHist);
  
   for (int h=OrdersTotal()-1; i>=0; i--)
   {   
      if (!OrderSelect(h, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      {
         if (lastOOTMarket < OrderOpenTime())
             lastOOTMarket = OrderOpenTime();
  
         if (lastOOTMarket < lastOOTHist)      // Если время открытия последнего открытого ордера (рыночного) ниже последнего открытого ордера из истории..
             lastOrderCloseTime = OrderCloseTime(); // Значит это искомый ордер
      }
   }

   Comment("Время закрытия последнего открытого ордера = ", lastOrderCloseTime);
   return (lastOrderCloseTime);
}

それでも、どこかおかしい。

 
ex1m:

EAのコードを見せようとしたのですが、ごちゃごちゃしているのは分かっているのですが、他のやり方は習ったことがありません) 保留注文を開くのは愚かなことです。1つの保留注文を反対側の注文なしで開くか、一方向の保留注文の束を全部開きます。注文の削除:毎回削除される、夕方の明確に指定された時間にOKの時もあれば、1日で終了することもある、全く終了しないこともある...。 さて、条件ですが、 1つ目のオープン保留注文が利益で終了した場合、2つ目は直ちに削除されます。私も正しく書いたかどうか疑問ですが、2つの反対のポジションをオープンしたくないので、仕事中に確認できません=(((((









質問に質問で答えること。なんなんだ、それ。

if ((volum<=0.0018)==true)// если объем свечей меньше или равно z пунктов 

解読してくれ、理解できない :)

ポジションを 開くためのチェックは、ポジションを開こうとした後でなければなりません。すなわち

if (ticket1<0)

注文を送った後に配置する。

AscやBidより高いか低いかで、ポジションを建てることができます。バイはこんな感じです。

 if (OOP > Ask)
 
hoz:


まあ、これはコードの最適化なんですけどね。結果は変わらない、と思っています。ただ、計算には時間がかかります。コードを直しましたが、やはり同じです。

まだ何か問題があるのでは?

いいえ、コードの最適化 ではありません。まさに最後の1枚を探しているところです。すべてのクローズド・オーダーの検索が完了し、その中の最後のクローズド・オーダーを見つけたら、その時だけ テイクによるクローズをチェックし、もしテイクによってクローズされていれば、その時だけ残りの検索を続けることに意味があるのです。

ループの内側で近いものをチェックすると、何が出てくるでしょうか。ロジックのエラーが発生します。
。1年前に締め切られた注文を選択したとします。その時間はどうせ-1以上になるので、takeで閉じるようにチェックする(ループの中でチェックされる)。はい、テイクオフで終了しました...。次に機能はどうなっているのでしょうか?そうですね。1年前にマークで閉じた その 注文は、引き続き機能しています。他に何が問題なのかを確認させてください。帰ってきたばかりなのに...。

 

書かれていたのは、2.最後のオープンポジションがテイクでクローズしたら、全部クローズしてください

つまり、こんな感じです。

//-----------------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos (string sy, int mn, int delta) {
   datetime t=0;
   int   i, k, j=-1;
   
// Сначала определим, что последняя закрытая позиция была закрыта по тейку (в пределах дельты)
   k=OrdersHistoryTotal()-1;
   for(i=k; i>=0; i--) {
      if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (OrderType()>1)            continue;            // Сначала забыл вписать, подправил
         if (t<OrderCloseTime()) {t=OrderCloseTime(); j=i;}
         }
      }  
   // Нашли последнюю. Проверим её закрытие по тейку
   if (OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)) {                      
      if (OrderProfit()+OrderSwap()+OrderCommission()<=0)   return(false);          // Закрыта с убытком или в ноль
      if (MathAbs(OrderTakeProfit()-OrderClosePrice())>delta*Point) return(false);  // закрыта в профите, но не в пределах дельты
      else t=OrderOpenTime();    // Если последняя закрытая была закрыта по тейку (в пределах дельты), запомним время её открытия
      }
   else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");return(false);}
// Здесь мы имеем последнюю закрытую позицию в профите и закрытую по тейку (в пределах дельты), ищем дальше
   k=OrdersTotal()-1;
   for(i=k; i>=0; i--) {
      if (OrderSelect(i,SELECT_BY_POS)) {
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (OrderType()>1)            continue;
         if (t<OrderOpenTime()) return(false);  // Выбранная рыночная позиция открыта позже закрытой по тейку
         }
      else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
      }
   return(true);  // Найденная закрытая по тейку позиция была открыта позже всех, возвращаем её время открытия
}
//-----------------------------------------------------------------------------------------------+

この関数には、チェックしたいシンボル、マジックナンバー、デルタ(ピップ単位の距離=注文の取値と終値の差)を、次のように渡します。

   if (isCloseByTakeLastOpenPos (Symbol(), Magic, 5)) { // Если последняя открытая была закрыта по тейку ...
      // ... тут обрабатываем эту ситуёвину
      }
   else {   // Иначе ...
      // тут обрабатываем, если последняя закрытая была открыта не последней или ...
      // ... последняя закрытая была закрыта с убытком или в профите, но за пределами дельты
      }

この機能は、私の手書きで書いたもので、チェックはしていません。したがって、誤りの検索 はお任せします。

intにしてリターンコードを使ってもいい。例えば、探しているポジションが存在しないか、存在しても損失で決済された場合は、-1を返します。
存在し、利益で決済されたが、デルタ内ではない場合は、0を返します。
存在し、利益で決済され、Take(デルタ内)であれば、1を返します...。

イマジネーションの幅が広がる...。

 
artmedia70:

一方、テイクのクローズを確認すると、何が出てくるか?ロジックエラーが発生します。

例えば、1年前に締め切られた注文を選択したとします。その時間はいずれにせよ-1より大きくなるので、それをチェックしてテイクで閉じる(ループの内部ではこのチェックが行われる)。はい、テイクオフで終了しました...。


そのため、すべての注文でループをかけると、とにかくすべての注文でループをかけることになります。各注文の締め切りの時刻は、前回選択したものと比較されます。しかし、ここでパフォーマンスの問題に直面する。TakeProfitはループ内で常にチェックされ、最後の1ポジションだけ でなく、クローズしたポジション ごとにチェックされます。そうでしょう!?
 
PapaYozh:

そうですね。

しかし、Open[]があり、始値がある。


了解です、ありがとうございます。)
 
hoz:

そのため、すべての注文を循環させると、いかなる場合でも循環することになります。各注文の締め切りの時刻は、前回選択したものと比較されます。しかし、ここでパフォーマンスの問題に直面する。TakeProfitはループ内で常にチェックされ、最後の1ポジションだけでなく、クローズしたポジションごとにチェックされます。そうでしょう?
すでに、この機能の例を書いています。
 
hoz:

そのため、すべての注文を循環させると、とにかくすべての注文を循環させることになるのです。各注文の終了時刻は、前回選択したものと比較されます。しかし、ここでパフォーマンスの問題が発生します。TakeProfitはループ内で常にチェックされ、最後の1ポジションだけでなく、クローズしたポジションごとにチェックされます。そうでしょう!?

それは不具合です。

   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют.. 
  
      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
          lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
      
      if (MathAbs(OrderTakeProfit() - OrderOpenPrice()) < i_tp * pt) return(0); // ЗДЕСЬ ВЫХОДИМ ПРИ ПЕРВОМ ВСТРЕЧНОМ
      
      lastOOTHist = OrderOpenTime();   // Тогда время открытия последней закрытой позиции из истории
   }