KimIVの便利な機能 - ページ 49

 
KimIV писал (а)>>

ExistOrders() 関数の使用例です。

5.設定時間が2時間以上前の注文にチェックを入れる

ExistOrders("", -1, -1, TimeCurrent()-2*60*60);

こんばんは、このコメントを見て少し戸惑いました。私は今、ここでそれを考えています。5分以内」なのか「5分以降」なのか、どう表現したらいいのかわからない。(考える前に腑に落ちました!)。

保留中の注文が一定時間内にトリガーされなかった場合、その注文を削除する必要があります。例えば、「!」を設定してから5分以内に

してきました。

if (ExistOrders(NULL, OP_BUYSTOP, Magic,TimeCurrent()-5*60) >0) //ЕСЛИ ЕСТЬ ОРДЕР BUYSTOP > 5 min 
                 DeleteOrders(NULL, OP_BUYSTOP, Magic);
if (ExistOrders(NULL, OP_SELLSTOP, Magic,TimeCurrent()-5*60) >0) //ЕСЛИ ЕСТЬ ОРДЕР SELLSTOP > 5 min  
                 DeleteOrders(NULL, OP_SELLSTOP, Magic);

これでよいのでしょうか?しかし、テスターではうまくいきません。注文してもすぐに削除される。

ExistOrders()関数を正しく書くにはどうしたらよいでしょうか?

 
rid писал (а)>>
ちょっと戸惑いましたが...。

私も混乱しているようです。一緒に解きほぐしましょう...。:-)

エラー128、142、143を正しく処理するため、ExistOrders 関数にot パラメータ(発注時間)が導入されました。エラー処理の目的は、同じ順序の二重(実用的には三重)の設定を排除することである。そのために、注文送信時刻を記憶 し、取引試行を一時停止する。一時停止後、記憶した 時刻の後に設定した時刻のオーダーがあるかどうかを確認します。注文がある場合は、目標に到達した(注文が設定された)と判断し、取引の試行を終了します。つまり、順番の設定を確認した後の時間がot パラメータに渡される。遅くなる=早くならない

rid wrote (a)>>の ようになります。
保留中の注文が一定時間内にトリガーされなかった場合、その注文を削除する必要があります。例えば、「!」を設定してから5分以内に

ExistOrders 関数のot パラメータは、ここでは役に立ちません。逆方向にも作用します。より現在に近い方向に作用するのです。必要なのは、逆算することです。OrderSend 関数のexpiration パラメータ(またはSetOrder 関数のex パラメータ)は、このために最適です。

 

テスターのClosePosBySelect()関数です。

あらかじめ選択された1つのポジションのクロージングを実行します。以前、13ページで 掲載した同名の機能のライトバージョンです。余計なことはしない。余分な機能はありません。私の実務では、テスターでクローズしなかったポジションはありません。そのため、この機能にはチェックがありません。テスターでは不要です。

//+----------------------------------------------------------------------------+
//|  Автор   : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  double pp;

  if (OrderType()==OP_BUY) {
    pp=MarketInfo(OrderSymbol(), MODE_BID);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseBuy);
  }
  if (OrderType()==OP_SELL) {
    pp=MarketInfo(OrderSymbol(), MODE_ASK);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseSell);
  }
}

SZY.関数ClosePosBySelect()の使用例を、テスター用の関数OpenPosition()と共に後ほど紹介します。

 

皆さん、こんにちは。いちいちページを掘り返さなくてもいいように、ブランチ単位でコンテンツを作る必要があったのです。

あちこちの似たようなテーマの機能を集約しました。内容は1ページから40ページまで。

希望者は、続けて他のページを追加し、ここに掲載することができます。

ファイル:
 

こんにちは、イゴールさん、あなたの助けが必要です。e-CloseByPercentProfitと同様に、e-CloseByProfit EAにクロージング機能を実装することにしました。

すべて正常に動作し、エキスパートアドバイザーも正常に動作し、ターミナルも閉じます。しかし、ターミナルを開き直すと、すぐに閉じてしまいます。

この問題を修正するために、コードを変更するのを手伝ってください。

//+----------------------------------------------------------------------------+
//| e-CloseByProfit.mq4
//| キム・イゴールV.ことキムIV(KimIV)
//|http://www.kimiv.ru|
//| |
//|22.10.2006 Expert Advisorは、指定された時点ですべてのポジションを閉じます。
//| 利益水準。
//| 2008.06.20 ポイントでの利益計算の誤りを修正しました。
//+----------------------------------------------------------------------------+
#property copyright "Kim Igor V. aka KimIV"
#プロパティリンク "http://www.kimiv.ru"
#define MAGIC 20061022

//------- Expert Advisor の外部パラメータ --------------------------------------------------------------.
extern string _P_Expert = "---------- EA parameters";
extern bool CurSymbolOnly = false; // 現在のシンボルのみ
extern intProfit = 100; // テイクプロフィット
extern bool CloseTerminal = False; // ターミナルを閉じる
extern bool ShowComment = True; // コメントの表示
extern int NumberAccount = 0; // 取引口座の数
extern bool UseSound = True; // サウンドシグナルを使用する
extern string NameFileSound = "manycoin.wav"; // サウンドファイル名
extern int Slippage = 3; // 価格のスリッページ
extern inttern NumberOfTry = 5; // 試行回数

//------- Expert Advisor のグローバル変数 ------------------------------------------------------
色 clCloseBuy = Blue; // 色 clCloseSell = Red; // 買いの終値記号の色
color clCloseSell = Red; // 売りのクローズフラグの色
int CurProfit。

//------- 外部モジュールの接続 ----------------------------------------------------------------.
#include <stdlib.mqh>.
#include <WinUser32.mqh>.

//+----------------------------------------------------------------------------+
//| エキスパート初期化関数
//+----------------------------------------------------------------------------+
void init() { if (!IsTesting())Comment(""); }

//+----------------------------------------------------------------------------+
//| 専門家による初期化関数
//+----------------------------------------------------------------------------+
void deinit() { if (!IsTesting())Comment("); }

//+----------------------------------------------------------------------------+
//| エキスパートスタート機能
//+----------------------------------------------------------------------------+
void start() {
if (!IsTesting()){
if (NumberAccount>0 && NumberAccount!=AccountNumber()){
Message("Trading in the account is FORBIDDEN" +AccountNumber());
を返します。
} else Comment(");
}

CloseByProfit()。
if (ShowComment) {.
コメント(IIFs(CurSymbolOnly, "CurSymbolOnly ",")),
"現在の利益=",CurProfit," p."
"クローズプロフィット=",テイクプロフィット," p."
);
}
}


//+----------------------------------------------------------------------------+
//| 作成者 : Kim Igor V. aka KimIV,http://www.kimiv.ru||Google Play!
//+----------------------------------------------------------------------------+
| バージョン:2008年2月19日
//| 説明:あらかじめ選択された1つのポジションのクローズ|NEWSポストセブン
//+----------------------------------------------------------------------------+
void ClosePosBySelect({)
bool fc;
を閉じます。
double ll, pa, pb, pp;
int err, it;

if (OrderType()==OP_BUY || OrderType()==OP_SELL) {。
for (it=1; it<=NumberOfTry; it++) {.
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
while (!IsTradeAllowed())スリープ(5000)。
RefreshRates()。
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID)とする。
if (OrderType()==OP_BUY){
pp=pb; clClose=closeBuy。
} else {
pp=pa; clClose=closeSell;
}
ll=OrderLots()です。
fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose)とする。
if (fc) {
if (UseSound) PlaySound(NameFileSound); break;
} else {
err=GetLastError()です。
if (err==146) while (IsTradeContextBusy())Sleep(1000*11)です。
Print("Error(",err,") Close ",GetNameOP(OrderType())," ",
ErrorDescription(err),", try ",it);
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp);
Print("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(),
" tp=",OrderTakeProfit()," mn=",OrderMagicNumber());
Sleep(1000*5)です。
}
}
} else Print("無効な取引操作です。Close ",GetNameOP(OrderType()))です。
}

//+----------------------------------------------------------------------------+
//| 作成者 : Kim Igor V. aka KimIV,http://www.kimiv.ru||Google Play!
//+----------------------------------------------------------------------------+
| バージョン:2008年2月19日
//| 説明:市場価格でポジションをクローズすると、最初に利益を得ることができます。
//+----------------------------------------------------------------------------+
//| パラメータ: |
//| sy - 楽器の名前 (" - 任意のシンボル, |)
//| NULL - 現在のシンボル)
| //| op - 操作 (-1 - 任意の位置)
//| mn - MagicNumber (-1 - 任意のマジック) |.
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {.
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();

// 最初に利益が出ているポジションを閉じる
for (i=k-1; i>=0;i--){。
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
if ((OrderSymbol()==sy || sy=="))&& (op<0 || OrderType()==op)){
if (OrderType()==OP_BUY || OrderType()==OP_SELL) { (オーダータイプ()==OP_BUY)
if (mn<0 || OrderMagicNumber()==mn) {.
if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
}
}
}
}
}
// あとは全部
k=OrdersTotal()。
for (i=k-1; i>=0;i--){。
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
if ((OrderSymbol()==sy || sy=="))&& (op<0 || OrderType()==op)){
if (OrderType()==OP_BUY || OrderType()==OP_SELL) { (オーダータイプ()==OP_BUY)
if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
}
}
}
}
}

//+----------------------------------------------------------------------------+
///利益ですべてのポジションをクローズする。
//+----------------------------------------------------------------------------+
void CloseByProfit() {
double pa, pb, pp;
int i, k=OrdersTotal(), pr=0;

for (i=0; i<k; i++) {.
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
if (!CurSymbolOnly || OrderSymbol()==Symbol()){
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID)とする。
pp=MarketInfo(OrderSymbol(), MODE_POINT)とする。
if (pp==0) if (StringFind(OrderSymbol(), "JPY")<0) pp=0.0001; else pp=0.01;
if (OrderType()==OP_BUY){
pr+=NormalizeDouble((pb-OrderOpenPrice())/pp,0)となります。
}
if (OrderType()==OP_SELL) { (オーダータイプ==OP_SELL)
pr+=NormalizeDouble((OrderOpenPrice()-pa)/pp, 0)となります。
}
}
}
}
CurProfit=pr;
if (CurProfit>=TakeProfit) ClosePosFirstProfit();
if (CloseTerminal && !ExistPositions())CloseTerminal()。
}
//+----------------------------------------------------------------------------+
//| 取引端末を終了します。
//+----------------------------------------------------------------------------+
void CloseTerminal() {
Print("CloseTerminal() "がトリガーされました;)
int hwnd=WindowHandle(Symbol()、Period());
int hwnd_parent=0;

while(!IsStopped()){
hwnd=GetParent(hwnd)。
if (hwnd==0) break;
hwnd_parent=hwnd;
}
if (hwnd_parent!=0) PostMessageA(hwnd_parent, WM_CLOSE, 0, 0)を実行。
}

//+----------------------------------------------------------------------------+
//| 存在フラグを返す
//| パラメータ: |
//| sy - 楽器の名前 (" - 任意のシンボル, |)
//| NULL - 現在のシンボル)
| //| op - 操作 (-1 - 任意の位置)
//| mn - MagicNumber (-1 - 任意のマジック) |.
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1) { {.
int i, k=OrdersTotal();

if (StringLen(sy)==1 && StringGetChar(sy, 0)==48) sy=Symbol();
for (i=0; i<k; i++) {.
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
if (OrderSymbol()==sy || sy=="){
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {。
if (op<0 || OrderType()==op) { }.
if (mn<0 || OrderMagicNumber()==mn) return(True);
}
}
}
}
}
return(False)です。
}
//+----------------------------------------------------------------------------+
//| 作成者 : Kim Igor V. aka KimIV,http://www.kimiv.ru||Google Play!
//+----------------------------------------------------------------------------+
| バージョン:2005年9月1日
//| 説明:貿易業務の名称を返す。
//+----------------------------------------------------------------------------+
//| パラメータ
//| op - 貿易操作の識別子 |.
//+----------------------------------------------------------------------------+
文字列 GetNameOP(int op) {
スイッチ(op) {
case OP_BUY : return("買い");
case OP_SELL : return("Sell");
case OP_BUYLIMIT : return("BuyLimit")。
case OP_SELLLIMIT : return("SellLimit")。
case OP_BUYSTOP : return("BuyStop")。
case OP_SELLSTOP : return("SellStop")。
default : return("Unknown Operation");
}
}

//+----------------------------------------------------------------------------+
//| 作成者 : Kim Igor V. aka KimIV,http://www.kimiv.ru||Google Play!
//+----------------------------------------------------------------------------+
|バージョン:2008年02月01日
//| 説明:条件によって2つの値のうちどちらかを返す。
//+----------------------------------------------------------------------------+
string IIFs(bool condition, string ifTrue, string ifFalse) {.
if (条件) return(ifTrue); else return(ifFalse);
}

//+----------------------------------------------------------------------------+
//| コメントとログにメッセージを出力する
//+----------------------------------------------------------------------------+
void Message(文字列m) {
コメント(m)
if (StringLen(m)>0) Print(m);
}
//+----------------------------------------------------------------------------+

 
Vkorch писал (а)>>
こんにちは、イゴールさん、あなたの助けが必要です。e-CloseByProfitのEAにe-CloseByPercentProfitと同様のターミナルクローズ関数を書くことにしました。

EAが動作し、端末が終了するなど、すべて正常に動作しています。しかし、ターミナルを再び開くと、Expert Advisorがすぐに閉じてしまいます。
この不足を解消するために、コードを変更する必要があります。

こんな感じで作ってください。

CurProfit=pr;
if (CurProfit>=TakeProfit) {
  ClosePosFirstProfit();
  if (CloseTerminal && !ExistPositions()) CloseTerminal();
}
 
KimIV писал(а)>>

こんな感じで作ってください。

イゴールさん、ありがとうございます。修正しました。しかし、コンパイル時にエラーが発生します

'(' - 関数定義 unexpected C:\Program FilesMetaTrader - Alparièxperts╱CloseByProfit.mq4 (180, 19)

どうしたらいいのでしょうか?

 

Igorさん、注文とポジションを扱うための 関数のライブラリを作っていただけませんか?このライブラリは2年以上前から開発・テストされており、ファイルを添付しましたので、もしかしたら何かの役に立つかもしれません。

については

OpenPosition("GBPJPY", OP_SELL, 0.1, pb+23*po, pb-44*po)。

OpenPosition("GBPJPY",OP_SELL, 0.1, 23, 44)を呼び出す方がいいかもしれませんね。

а

double pa=MarketInfo("USDCAD", MODE_ASK);
double pb=MarketInfo("USDCAD", MODE_BID
);
double po=MarketInfo(
"USDCAD", MODE_POINT);
 this insert 
  
 
double lot_min =MarketInfo(Symbol(),MODE_MINLOT)
; 
if(Lots<lot_min) return;

関数内部で計算する。すなわち、sl の 値を tp に渡し、関数内部ですべてを正しく計算し、正規化する。


	          
ファイル:
 

イゴールさん、こんにちは。

0.3ロットのポジションを開いている場合、必要です。

1.0.1ロットのポジションの一部を閉じる。

モディファイ(ストップロスを別のレベルに移動)

2.1 より近い位置の部分 0.1 ロット

修正(ストップロスを別のレベルに設定する)。

3.クローズポジション

もう1つ質問を?パーシャルポジションが閉じているとき。

OrderClose(OrderTicket(),NormalizeDouble(OrderLots()/3,2),Ask,3,Violet)となります。

エラー131(間違ったボリューム)が表示されます。

初心者のために回答お願いします。言葉でも構いません。

.

 
Prival писал (а)>>
イゴールさん、 のオーダーとポジションを扱う関数をライブラリ化していただけないでしょうか?

いや、そうじゃなくて...。原則的には、すでにあるべき姿にアレンジされているのですが......。まだこのライブラリの全機能が公開されているわけではないので、掲載はしていませんが...。このスレッドが立ち上げられてから登場したものが、あと2、3個残っています。

あとはじっくり考えます...。