externstring time1 = "n";// externstring time2="m";
externdouble lot=0.2;// объявили лотexternint 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 свечей М5int 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
}
//+-------------------------------------------------------------------------------------+//| Получаем состояние последней позиции (Открыта или закрыта) |//+-------------------------------------------------------------------------------------+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);
}
//-----------------------------------------------------------------------------------------------+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 { // Иначе ...// тут обрабатываем, если последняя закрытая была открыта не последней или ...// ... последняя закрытая была закрыта с убытком или в профите, но за пределами дельты
}
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(); // Тогда время открытия последней закрытой позиции из истории
}
もし7時43分になっても寝なかったら...。ということは、スペルはgrailなんでしょうかね!?
いや、そんな悪態をつく必要はない :))ユセフから聖杯を もらった。スーツケースの中で、天からのマナを待っています!モルディブに行きます! :))
だから、あなたが何をしたのか見せてください...。テレパスはいないよ、休暇中だから。
Expert Advisorの一般的なコードをアップロードして、何をすべきかを明確にしました。)
どこがバカなのか、もう一度教えてあげよう
保留中の注文を開く: 1つの保留中の注文を反対側の注文なしで開くか、または一方向の保留中の注文をすべて開きます。
それは、注文を削除します:時には明確に指定された時間に夕方に大丈夫、そして時には一日で、または全く閉じない...
さて、その条件とは.
1つ目の未決済注文が利益で決済されると、2つ目の注文はすぐに削除されます。正しく記述できているか疑問ですが、2つの反対ポジションを持ちたくないので、実際に確認できません=(((
最後に閉じた注文を検索するとき、まず最も最近閉じた注文を見つけるべきですが、takeで閉じるかどうかのチェックはループの外に移動させるべきです。そうしないと、閉じた注文ごとにtakeで閉じるかどうかをチェックし、もしそうなら、最新の注文ではなく、ループ内の最初にtakeで閉じた注文の時刻を記憶します。
まあ、これはコードの最適化な んですけどね。結果は変わらない、と思っています。ただ、計算には時間がかかります。コードを直しましたが、やはり同じです。
それでも、どこかおかしい。
EAのコードを見せようとしたのですが、ごちゃごちゃしているのは分かっているのですが、他のやり方は習ったことがありません) 保留注文を開くのは愚かなことです。1つの保留注文を反対側の注文なしで開くか、一方向の保留注文の束を全部開きます。注文の削除:毎回削除される、夕方の明確に指定された時間にOKの時もあれば、1日で終了することもある、全く終了しないこともある...。 さて、条件ですが、 1つ目のオープン保留注文が利益で終了した場合、2つ目は直ちに削除されます。私も正しく書いたかどうか疑問ですが、2つの反対のポジションをオープンしたくないので、仕事中に確認できません=(((((
質問に質問で答えること。なんなんだ、それ。
解読してくれ、理解できない :)
ポジションを 開くためのチェックは、ポジションを開こうとした後でなければなりません。すなわち
注文を送った後に配置する。
AscやBidより高いか低いかで、ポジションを建てることができます。バイはこんな感じです。
if (OOP > Ask)
まあ、これはコードの最適化なんですけどね。結果は変わらない、と思っています。ただ、計算には時間がかかります。コードを直しましたが、やはり同じです。
まだ何か問題があるのでは?
いいえ、コードの最適化 ではありません。まさに最後の1枚を探しているところです。すべてのクローズド・オーダーの検索が完了し、その中の最後のクローズド・オーダーを見つけたら、その時だけ テイクによるクローズをチェックし、もしテイクによってクローズされていれば、その時だけ残りの検索を続けることに意味があるのです。
ループの内側で近いものをチェックすると、何が出てくるでしょうか。ロジックのエラーが発生します。
。1年前に締め切られた注文を選択したとします。その時間はどうせ-1以上になるので、takeで閉じるようにチェックする(ループの中でチェックされる)。はい、テイクオフで終了しました...。次に機能はどうなっているのでしょうか?そうですね。1年前にマークで閉じた その 注文は、引き続き機能しています。他に何が問題なのかを確認させてください。帰ってきたばかりなのに...。
書かれていたのは、2.最後のオープンポジションがテイクでクローズしたら、全部クローズしてください
つまり、こんな感じです。
この関数には、チェックしたいシンボル、マジックナンバー、デルタ(ピップ単位の距離=注文の取値と終値の差)を、次のように渡します。
この機能は、私の手書きで書いたもので、チェックはしていません。したがって、誤りの検索 はお任せします。
intにしてリターンコードを使ってもいい。例えば、探しているポジションが存在しないか、存在しても損失で決済された場合は、-1を返します。
存在し、利益で決済されたが、デルタ内ではない場合は、0を返します。
存在し、利益で決済され、Take(デルタ内)であれば、1を返します...。
イマジネーションの幅が広がる...。
一方、テイクのクローズを確認すると、何が出てくるか?ロジックエラーが発生します。
例えば、1年前に締め切られた注文を選択したとします。その時間はいずれにせよ-1より大きくなるので、それをチェックしてテイクで閉じる(ループの内部ではこのチェックが行われる)。はい、テイクオフで終了しました...。
そのため、すべての注文でループをかけると、とにかくすべての注文でループをかけることになります。各注文の締め切りの時刻は、前回選択したものと比較されます。しかし、ここでパフォーマンスの問題に直面する。TakeProfitはループ内で常にチェックされ、最後の1ポジションだけ でなく、クローズしたポジション ごとにチェックされます。そうでしょう!?
そうですね。
しかし、Open[]があり、始値がある。
了解です、ありがとうございます。)
そのため、すべての注文を循環させると、いかなる場合でも循環することになります。各注文の締め切りの時刻は、前回選択したものと比較されます。しかし、ここでパフォーマンスの問題に直面する。TakeProfitはループ内で常にチェックされ、最後の1ポジションだけでなく、クローズしたポジションごとにチェックされます。そうでしょう?
そのため、すべての注文を循環させると、とにかくすべての注文を循環させることになるのです。各注文の終了時刻は、前回選択したものと比較されます。しかし、ここでパフォーマンスの問題が発生します。TakeProfitはループ内で常にチェックされ、最後の1ポジションだけでなく、クローズしたポジションごとにチェックされます。そうでしょう!?
それは不具合です。