OK 少しだけ進展がありました。しかし、私は問題があります。あるペアで初めて注文を出すと、履歴に比較する取引がない限り、注文の半分を決済しません...。この場合、最初の取引が1:1になったとしても、履歴プールで比較するものがないため、ポジションの半分を決済することはできません...同様に、私は何が間違っているのか完全にわからないのですが、比較するために履歴に取引があっても、(OrderOpenTime())同じ価格で連続的にそれを閉じているのでしょうか?
int start()
{
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////if(OrderSelect(OrderTicket(),SELECT_BY_TICKET, MODE_TRADES)==True)
{
OrderEntryTime = OrderOpenTime();
datetime OrderEntryClosed = OrderCloseTime();
CurrentSymbol = OrderSymbol();
if(OrderType() <= OP_SELL && CurrentSymbol == Symbol())
{
Print(" The Selected Order ", CurrentSymbol, " matches this pair: ", Symbol());
Print(" The Open Time of this order was: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));
}
if(OpenOrdersThisPair(Symbol())>0 && CurrentSymbol==Symbol())
{
// Need a for loop to compare historically closed trades that match with Symbol() and the "datetime OrderEntryTime = OrderOpenTime();" above.
CheckHistoricalTrades();
}
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void CheckHistoricalTrades()
{
for(int Pos=OrdersHistoryTotal()-1; Pos >= 0; Pos--)
{
if (OrderSelect(Pos, SELECT_BY_POS, MODE_HISTORY)
&& OrderMagicNumber() == MagicNumber
&& CurrentSymbol == Symbol()
&& OrderType() <= OP_SELL
&& OrderEntryTime > OrderOpenTime() && OrderType()==OP_BUY)
{
Print(" Last Order Open Time: ", TimeToStr(OrderOpenTime(), TIME_MINUTES | TIME_DATE),
" Was not the same as current order: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));
CloseHalfOrder();
}
if(OrderEntryTime > OrderOpenTime() && OrderType()==OP_SELL)
{
Print("Last Order Open Time: ", TimeToStr(OrderOpenTime(), TIME_MINUTES | TIME_DATE),
" Was not the same as current order: ", TimeToStr(OrderEntryTime, TIME_MINUTES | TIME_DATE));
CloseHalfOrder1(); // This just closes half of the position at 1:1 - then if OrderStopLoss > OrderOpenPrice() = MoveToBreakEven() void kicks in.
}
}
}
2013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: Last Order Open Time: 2010.02.0409:22 Was not the same as current order: 2010.02.2501:16 //>>> "Last Order Open time" here doesn't make sense?2013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: SELL First Target Closed: 0.03 OP_SELL First Closed - Open Time: 2010.02.0515:07 //>>> This is the same as "The Last Order Open Time"?2013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: close #16 sell 0.03 GBPJPY at 138.270 sl: 138.240 tp: 135.082 at price 136.637 //>>> Therefore, it closed it here.2013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: Ask >= FirstTarget_Sell - Current Ask: 136.637 FirstTarget_Sell: 136.676 //>>> The ask is at the OrderClose() price.2013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: FirstTarget_Sell: 136.6762013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: Order Ticker Number = 102013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: The Lots to close is: 0.0302013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: Last Order Open Time: 2010.02.0515:07 Was not the same as current order: 2010.02.2501:162013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: The Open Time of this order was: 2010.02.2501:162013.08.0913:56:202010.02.2509:16 Trend Fishing 3 Exits GBPJPY,H1: The Selected Order GBPJPY matches this pair: GBPJPY
問題が目の前にあるのは分かっているのですが、それが見えません...。
しかし、私が抱えている問題は、同じ「OP_BUY」または「OP_SELL」を異なる価格で最大4回部分決済しようとしていることです...。私が尋ねるべき質問は、すべての部分的なクローズ(1つの与えられた取引の任意のロットと価格)は、その定義済みの "OrderClose()" パラメータセットで一度だけ部分的にクローズするルールを持つ方法を得ることができるかどうかだと思います...。OrderOpenTime()は基本的に一度しか動作せず、他のタイプのOrderClose()関数が全く発生しないように制限されます...。私は4つのOrderClose()関数に1つのルールを適用できる方法を見つけたいのです...。( みんなが4つのオーダーを開くことを提案しているのは知っていますが、あまり深く考えずに、その方法でやるのは私にとっては効率が悪いのです。
単純にチケット番号と、実行可能なパーシャルクローズの残り回数を格納する2次元配列を用意してはどうでしょうか。
概要/擬似コード
1. 静的な 2 次元配列 cOrders[][2] を定義します。
2. 新しい注文が入るたびに、cOrdersの1次元目をsize+1にリサイズし、新しい注文のチケット番号を[x][0]に、残りのパーシャルクローズの数(この場合、4)を[x][1]に格納します。
3. 任意の時間間隔 (たとえば start() 毎) で、配列をループして、格納されているチケット番号を使用して各オーダーを選択し、パーシャルクローズを実行する必要があるかどうかを判断します。
4. 部分クローズを実行する必要がある場合(ステップ 3 参照)、OrderClose() を使用して注文を部分クローズし、cOrders[x][0] を更新して新しいチケット番号を反映し、cOrders[x][1] を 1 だけ削減します。
5. 注文がクローズされた、または実行可能な部分クローズの数が 0 になっている注文を cOrders から削除 します。
唯一の問題は、プラットフォームやコンピュータの再起動時に何をするかということです。その情報をファイルに保存しておき、プラットフォーム再起動時にinit()でそのファイルを読み込むという方法もあります。
単純にチケット番号と、実行可能なパーシャルクローズの残り回数を格納する2次元配列を用意してはどうでしょうか。
概要/擬似コード
1. 静的な 2 次元配列 cOrders[][2] を定義します。
2. 新しい注文が入るたびに、cOrdersの1次元目をsize+1にリサイズし、新しい注文のチケット番号を[x][0]に、残りのパーシャルクローズの数(この場合、4)を[x][1]に格納します。
3. 任意の時間間隔 (たとえば start() 毎) で、配列をループして、格納されているチケット番号を使用して各オーダーを選択し、パーシャルクローズを実行する必要があるかどうかを判断します。
4. 部分クローズを実行する必要がある場合(ステップ 3 参照)、OrderClose() を使用して注文を部分クローズし、cOrders[x][0] を更新して新しいチケット番号を反映し、cOrders[x][1] を 1 だけ削減します。
5. 注文がクローズされた、または実行可能な部分クローズの数が 0 になっている注文を cOrders から削除します。
唯一の問題は、プラットフォームやコンピュータの再起動時に何をするかということです。その情報をファイルに保存しておき、プラットフォーム再起動時にinit()でそのファイルを読み込むことができます。
マジックナンバーの一部を使って別のパラメータを 定義する方法がわからないのですが?OrderOpenTime()を使うのは論理的なルートではないと思うのですが...。このスレッドがこんなに長くなるなんて信じられません。笑
私は神に誓って、私が(他の皆さんから多くの助けを得て!)それをクラックしたら、これに関するスレッドを行うつもりです。
これを行う最も簡単な方法は、マジックナンバーを使うことだと思います。例えば、部品の数、注文番号、日、月、EA番号など、数字の一部を使って異なるパラメーターを定義します。 閉じたパーツと開いたパーツの両方が同じマジックナンバーを持っていると仮定します ... ...
マジックナンバーを使って情報を暗号化することは可能ですが、いくつかの制限があります。 まず、マジックナンバーは int 型であるため、10 桁の長さで、左端の桁は 1 か 2 でなければなりません (左端の桁が 2 の場合、左端の 2 桁目は 7 以下でなければなりません)。 次に、現在のオーダーが部分的に閉じる必要があるか(あるいは閉じることができるか)どうかを判断するために、各オーダーのすべての部分を見つけるためにすべての履歴を確認するために、start()ごとに多くの時間がかかるかもしれません。 ただ、その時間が些細なことかどうかはわかりません。
待って、複数のMagicNumbersを持つことはできないの?最初のOrderSend()に一つ、OrderModify()に一つ、最初のターゲット1:1でポジションの半分を決済した後、MagicNumberを変更するためにオーダーを修正する?したがって、私が最初に1:1で半分を閉じようとしているとき、現在のオープン「OP_BUY」が私が最初に与えたマジックナンバーに対応している限り、それは1:1しか閉じない のでしょうか?その後、部分的にクローズした後、そのマジックナンバーを修正・変更するのですか!?
笑そんなの簡単でしょう?
UPDATE: 明らかに今日これを見るのをやめなければなりません - MagicNumberを修正することはできません - できればそうしたいのですが... (facepalm)。(顔面蒼白) - これがどれだけ簡単か想像できますか......。
待てよ、複数のマジックナンバーを持つことはできないのか?最初のOrderSend()に一つ、OrderModify()に一つ、最初のターゲット1:1でポジションの半分が閉じられた後、注文を修正してマジックナンバーを変更する?したがって、私が最初に1:1で半分を閉じようとしているとき、現在のオープン「OP_BUY」が私が最初に与えたマジックナンバーに対応している限り、それは1:1しか閉じないのでしょうか?その後、部分的にクローズした後、そのマジックナンバーを修正・変更するのですか!?
笑そんなの簡単でしょう?
第一に、最初のOrderSend()の後、OrderModify() を使用してマジックナンバーを追加/変更することができません。 次に、OrderClose()を使って部分的に注文を閉じるとき、新しい注文は古い注文と同じマジックナンバーを取得する(と仮定する)。
第一に、最初のOrderSend()の後、OrderModify() を使用してマジックナンバーを追加/変更することができません。 次に、OrderClose() を使って部分的に注文を閉じるとき、新しい注文は古い注文と同じマジックナンバーを取得します(と仮定します)。
はい、自分がいかに遅れているかに気づきました。長い一日でした。
はい、最初の部分的なクローズの後、残りのポジションは、最初に始めたのと同じマジックナンバーが割り当てられたままです。
今、本当にイライラしています...。マジックナンバーさえ修正できれば、簡単すぎる!?部分決済を一回で済ませるには、論理的な方法が必要です。
論理的思考が全くできていない。
1.OrderOpenTime()を知ることよりも、マジックナンバーを修正することの方が、どのように役に立つのでしょうか? それはその注文の識別子として全く同じものです。
2.なぜtimetostrで日/時/分形式に変換しているのですか? OrderOpenTime()はすでにタイムスタンプ形式になっており、以下のようになります。1375356521 これは、注文が開始された正確な時刻を秒単位で表しています。
もし、マジックナンバーを変更できるのであれば、注文のマジックナンバーを比較して、それがすでに一部が閉じられたことを意味するマジックナンバーを持っていないことを確認する必要がありますね?
もしそれができるなら、なぜ注文のOrderOpenTimeを、すでに一部が閉じられた注文であることを意味するタイムスタンプと比較できないのでしょうか?
static datetime alreadypartclosed;
部分閉鎖が成功した場合
alreadypartclosed = OrderOpenTime();
注文が部分決済の条件を満たした場合
if(OrderOpenTime() != alreadypartclosed )
複数の未決済注文を同時に管理する場合は、部分決済注文の各タイムスタンプを格納する配列[]を使用します。