どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 125 1...118119120121122123124125126127128129130131132...1178 新しいコメント Artyom Trishkin 2013.09.07 04:32 #1241 Sepulca: 私ならこうする。 追伸:同時に回答))) 理解できない。 if(shift>0) shift=shift-1; 最初のバーで開いている場合、ゼロからゼロまで見る? Mikhail Kozhemyako 2013.09.07 04:42 #1242 artmedia70:理解できない。最初のバーで開いている場合、ゼロからゼロまで見ているのでしょうか? これは、注文の開始価格が、開始の瞬間にすでにLowよりずっと高い場合に備えて、少し安心するためのものです。つまり、オープニングバーを検索に使わないのです。そのためのPERIOD_M1です。 Artyom Trishkin 2013.09.07 04:55 #1243 Sepulca: これは、注文の開始価格が、開始時にすでにLowよりかなり高い場合に備えて、小さなヘッジを行うものです。つまり、検索にオープニングバーを使用しないのです。そのためのPERIOD_M1です。 私なら違う方法でやりますね。一般的には、ポジションが1小節以上続いたときに検索を開始します。結局、ベストプライスはオープニングバーですぐかもしれないので、それを無駄にすることになる。 Mikhail Kozhemyako 2013.09.07 06:03 #1244 artmedia70: 私なら違う方法でやります。一般的には、ポジションが1小節以上続いてから検索を開始することになりますね。結局、ベストプライスはオープニングバーだけかもしれないので、それを無駄に... 私もそう思います。注文を出した瞬間から最小値を再検索するよりも、各ティック ごとに配列内の未決済注文の最小値(または最大値)を記憶しておき、条件に達した時点で注文をクローズする方が、いわば効率的かもしれませんね。 ShortOrderTicket[i]=OrderSend(Symbol(),OP_SELL,...... if(ShortOrderTicket[i]>=0) min[i]=Bid; //..................................................... //На каждом тике обновляем минимумы для каждого открытого ордера for(i=0;i<N;i++){ if(ShortOrderTicket[i]>=0){ min[i]=MathMin(min[i],Ask); } // Если достигнуто условие, закрываем ордер if(Ask>min[i]+Delta) if(OrderClose(ShortOrderTicket[i],.....))ShortOrderTicket[i]=-1; } また、接続が切れたり、アドバイザーの再起動などのトラブルがあった場合、注文時のストップロスを随時修正するようにしています。 Viktar Dzemikhau 2013.09.07 06:58 #1245 artmedia70: ここでは配列は参照渡しでなければならないと主張しました。そうでなければ,この関数は厳密に定義された1つの配列だけを扱う必要があります.グローバルに定義していても、 。 ふむ。どの配列が呼び出し側の関数に 渡されるかに依存します。特定の配列であれば、呼び出された関数はその配列で動作するのですが・・・。なぜなら、それは... もし、例えば void FindOrders(int massive[]) { int oType; ArrayInitialize(massive, 0); for (int i=OrdersTotal() - 1; i>=0; i--) { if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; if (OrderSymbol() != Symbol()) continue; if (OrderMagicNumber() != i_magic) continue; oType = OrderType(); massive[oType] = massive[oType] + 1; } } このように呼びかけることで FindOrders(OrdersMassive) OrdersMassive 配列と連動しています。 といった具合に。 FindOrders(massiveOfOrders) massiveOfOrders 配列で。 forexman77 2013.09.07 06:59 #1246 取引開始時のスプレッドを 調べる方法、もっと言えばログに表示させる方法を教えてください。 Viktar Dzemikhau 2013.09.07 07:01 #1247 Forexman77: 取引開始時にスプレッドの大きさを知る方法、もしくはログに表示する方法を教えてください。 もし(spread) == 何らかの値であれば、...何かをしてください...(例えば、注文を開く、またはその値をジャーナルに印刷するなど)。あるいはその逆で、ある値と等しくないか大きい(小さい)場合は、ジャーナルに表示し、何か処理をする。好きなようにやればいいんです。 Viktar Dzemikhau 2013.09.07 07:05 #1248 昨日の質問を繰り返させていただきます。別スレッドに投稿するのはやめてほしい。不明な点があれば、すべてお答えします。 必要なポジションを閉じるのにまだ苦労しています。状況は次のとおりです。 1.ポジションの閉鎖を追跡している。 2.最後のポジションがテイクラインでクローズすると同時に......すべてのオープンポジションとペンディングポジションを一度にクローズする必要があります。すべてロットごとに、つまり大きなロットを一度に、そして小さなロットを順に並べて閉じています。これは、あくまでオーダーの経験を積むためのものです。 実装は以下の通りです。 tick毎にstart() で。 for (int ord=OrdersTotal()-1; ord>=0; ord--) { if (!OrderSelect(ord,SELECT_BY_POS)) continue; if (OrderMagicNumber() != i_magic) continue; if (OrderSymbol() != Symbol()) continue; if (OrderType() == 6) continue; g_ticket = OrderTicket(); g_type = OrderType(); // Блок модификации ордеров if (i_sl != 0 || i_tp != 0) { if (OrderStopLoss() == 0 && OrderTakeProfit() == 0) { OrdersModifyer(g_ticket); } } // Закрытие всех ордеров, если последний ордер закрыт if (isCloseByTakeLastOpenPos(2)) { // if (g_type < 2) { ClosePosBySortLots(); } //else if (g_type > 1) { DeletePendingOrders(g_ticket); } } } 保留中の注文は必要に応じて削除されるので、成行注文を閉じることに関心があります。以下はその内容です。 //+-------------------------------------------------------------------------------------+ //| Получаем состояние последней позиции (Открыта или закрыта) | //+-------------------------------------------------------------------------------------+ bool isCloseByTakeLastOpenPos(int delta) { datetime lastOrderCloseTime = -1, // Время закрытия последнего открытого ордера lastOOTHist = -1; // Время открытия последнего открытого ордера из истории int j = -1; pr ("Запустилась функция isCloseByTakeLastOpenPos"); 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(); // ..последней закрытой позиции в истории j = i; pr ("j = " + j + " " + TimeToStr(TimeCurrent())); } } if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) { if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false); // pr ("OTP() = " + OrderTakeProfit() + "; OCP() " + OrderClosePrice() + " " + TimeToStr(TimeCurrent())); // pr ("OOP() = " + OrderOpenPrice() + "; OCP() " + OrderClosePrice() + " " + TimeToStr(TimeCurrent())); if (MathAbs(OrderTakeProfit() - OrderClosePrice()) > delta * pt) return (false); else { lastOOTHist = OrderOpenTime(); Comment("\n", "FUNC isCloseByTakeLastOpenPos: ", "\n", "j = ", j, "\n", "lastOOTHist = ", TimeToStr(lastOOTHist, TIME_SECONDS)); } } else { Comment("\n", "FUNC isCloseByTakeLastOpenPos: ", "\n", "j = ", j, "\n", "не удалось выбрать ордер в истории"); return(false); } for(int h=OrdersTotal()-1; h>=0; h--) { if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() != i_magic) continue; if (OrderSymbol() != Symbol()) continue; if (OrderType() > 1) continue; if (lastOOTHist < OrderOpenTime()) return(false); // Выбранная рыночная позиция открыта позже закрытой по тейку } else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);} } return (true); } //+-------------------------------------------------------------------------------------+ //| Закрытие ордеров, отсортированных по размеру лотов | //+-------------------------------------------------------------------------------------+ void ClosePosBySortLots() { double a[][2]; int p = 0; for (int i=OrdersTotal()-1; i>=0; i--) { if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if (OrderMagicNumber() != i_magic) continue; if (OrderSymbol() != Symbol()) continue; if (OrderType() < 2) { p++; ArrayResize(a, p); a[p-1][0] = OrderLots(); a[p-1][1] = OrderTicket(); } } pr ("ClosePosBySortLots(): " + "p = " + p); if (p > 0) { ArraySort(a, WHOLE_ARRAY, 0, MODE_DESCEND); for(i=0; i<p; i++) { if (OrderSelect(a[i][1], SELECT_BY_TICKET, MODE_TRADES)) { if (OrderCloseTime() == 0) ClosePosBySelect(); } } } } //+-------------------------------------------------------------------------------------+ //| Закрытие одного, предварительно выбранного ордера | //+-------------------------------------------------------------------------------------+ void ClosePosBySelect() { bool fc; color clClose, clCloseBuy = Blue, clCloseSell = Red; double ll, pa, pb, pp; int err, it, NumberOfTry = 3; if (OrderType() == OP_BUY || OrderType() == OP_SELL) { for (it=1; it<=NumberOfTry; it++) { while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); pa = MarketInfo(OrderSymbol(), MODE_ASK); pb = MarketInfo(OrderSymbol(), MODE_BID); if (OrderType() == OP_BUY) { pp = pb; clClose = clCloseBuy; } else { pp = pa; clClose = clCloseSell; } ll = OrderLots(); fc = OrderClose(OrderTicket(), ll, pp, 30, clClose); if (fc) { break; } else { err = GetLastError(); } } } else Print("Некорректная торговая операция. Close "); } なぜか一部の注文が締め切られない。私はいくつかのセグメントを見たときに印刷すると、私は何も理解していない。以下はその一例です。 コメントでは、lastOOTHist = 01:30:00となって いますが、これは実際には正しくありません。結果ウィンドウでlastOOTHistを確認すると、次のようになります。 閉店時間が違うのですが...。 ここで何が問題なのか? Рустам 2013.09.07 07:07 #1249 hoz: ふむ。どの配列が呼び出し側の関数に渡されるかに依存します。特定の配列であれば、呼び出された関数はその配列で動作するのですが...。なぜなら、それは...もし、例えばこのように呼びかけることでOrdersMassive 配列と連動しているといった具合に。massiveOfOrders 配列で。 関数に変数(配列)を値で渡すと、関数内部でローカル 変数が生成され、myFunct(int my_var)とヘッダーで宣言します。こうすることで、この変数の変化を関数の外から見ることができなくなる。また、配列の場合、コンパイラはこのことを念押ししてくる。 変数の値の変化を外から(関数の外から)見たい場合は、変数を参照渡しする : myFunct(int& my_var) Artyom Trishkin 2013.09.07 07:17 #1250 hoz: どの配列が呼び出し側の関数に渡されるかに依存します。ある配列があれば、呼び出された関数はその配列で動作する...。こんな感じです...。 もし、例えば このように呼ぶことで OrdersMassive 配列と連動している そして、このように。 配列massiveOfOrders を持つ その通りです。つまり、同じサイズと型の配列なら何でも渡せるのに、なぜ特定の配列を関数自体にハードコードさせる必要があるのか、ということです。 1...118119120121122123124125126127128129130131132...1178 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
私ならこうする。
追伸:同時に回答)))
理解できない。
最初のバーで開いている場合、ゼロからゼロまで見る?
理解できない。
最初のバーで開いている場合、ゼロからゼロまで見ているのでしょうか?
これは、注文の開始価格が、開始時にすでにLowよりかなり高い場合に備えて、小さなヘッジを行うものです。つまり、検索にオープニングバーを使用しないのです。そのためのPERIOD_M1です。
私なら違う方法でやります。一般的には、ポジションが1小節以上続いてから検索を開始することになりますね。結局、ベストプライスはオープニングバーだけかもしれないので、それを無駄に...
私もそう思います。注文を出した瞬間から最小値を再検索するよりも、各ティック ごとに配列内の未決済注文の最小値(または最大値)を記憶しておき、条件に達した時点で注文をクローズする方が、いわば効率的かもしれませんね。
また、接続が切れたり、アドバイザーの再起動などのトラブルがあった場合、注文時のストップロスを随時修正するようにしています。ここでは配列は参照渡しでなければならないと主張しました。そうでなければ,この関数は厳密に定義された1つの配列だけを扱う必要があります.グローバルに定義していても、 。
ふむ。どの配列が呼び出し側の関数に 渡されるかに依存します。特定の配列であれば、呼び出された関数はその配列で動作するのですが・・・。なぜなら、それは...
もし、例えば
このように呼びかけることで
OrdersMassive 配列と連動しています。
といった具合に。
massiveOfOrders 配列で。
取引開始時にスプレッドの大きさを知る方法、もしくはログに表示する方法を教えてください。
もし(spread) == 何らかの値であれば、...何かをしてください...(例えば、注文を開く、またはその値をジャーナルに印刷するなど)。あるいはその逆で、ある値と等しくないか大きい(小さい)場合は、ジャーナルに表示し、何か処理をする。好きなようにやればいいんです。
昨日の質問を繰り返させていただきます。別スレッドに投稿するのはやめてほしい。不明な点があれば、すべてお答えします。
必要なポジションを閉じるのにまだ苦労しています。状況は次のとおりです。
1.ポジションの閉鎖を追跡している。
2.最後のポジションがテイクラインでクローズすると同時に......すべてのオープンポジションとペンディングポジションを一度にクローズする必要があります。すべてロットごとに、つまり大きなロットを一度に、そして小さなロットを順に並べて閉じています。これは、あくまでオーダーの経験を積むためのものです。
実装は以下の通りです。
tick毎にstart() で。
for (int ord=OrdersTotal()-1; ord>=0; ord--) { if (!OrderSelect(ord,SELECT_BY_POS)) continue; if (OrderMagicNumber() != i_magic) continue; if (OrderSymbol() != Symbol()) continue; if (OrderType() == 6) continue; g_ticket = OrderTicket(); g_type = OrderType(); // Блок модификации ордеров if (i_sl != 0 || i_tp != 0) { if (OrderStopLoss() == 0 && OrderTakeProfit() == 0) { OrdersModifyer(g_ticket); } } // Закрытие всех ордеров, если последний ордер закрыт if (isCloseByTakeLastOpenPos(2)) { // if (g_type < 2) { ClosePosBySortLots(); } //else if (g_type > 1) { DeletePendingOrders(g_ticket); } } }保留中の注文は必要に応じて削除されるので、成行注文を閉じることに関心があります。以下はその内容です。
なぜか一部の注文が締め切られない。私はいくつかのセグメントを見たときに印刷すると、私は何も理解していない。以下はその一例です。
コメントでは、lastOOTHist = 01:30:00となって いますが、これは実際には正しくありません。結果ウィンドウでlastOOTHistを確認すると、次のようになります。
閉店時間が違うのですが...。
ここで何が問題なのか?
ふむ。どの配列が呼び出し側の関数に渡されるかに依存します。特定の配列であれば、呼び出された関数はその配列で動作するのですが...。なぜなら、それは...
もし、例えば
このように呼びかけることで
OrdersMassive 配列と連動している
といった具合に。
massiveOfOrders 配列で。
関数に変数(配列)を値で渡すと、関数内部でローカル 変数が生成され、myFunct(int my_var)とヘッダーで宣言します。こうすることで、この変数の変化を関数の外から見ることができなくなる。また、配列の場合、コンパイラはこのことを念押ししてくる。
変数の値の変化を外から(関数の外から)見たい場合は、変数を参照渡しする : myFunct(int& my_var)
どの配列が呼び出し側の関数に渡されるかに依存します。ある配列があれば、呼び出された関数はその配列で動作する...。こんな感じです...。
もし、例えば
このように呼ぶことで
OrdersMassive 配列と連動している
そして、このように。
配列massiveOfOrders を持つ