コーディングの方法は? - ページ 344

 
mladen:

tkuan77

最後に閉じたバーを見つけ、最後に閉じたバーの日が現在の日と同じかどうかを確認する必要があります。

この関数のようなものを使用して、最後のクローズドオーダーの時間を取得することができます。

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime();

}

return(CloseTime);

}

そして、日付が同じかどうかをチェックすることができます

こんにちは、mladenさん。

しかし、この部分をどこに挿入すればいいのでしょうか?私はまだコーディングの初心者で、Forループがどのように機能するのか理解できないので、このような質問をするのは申し訳ないです。

よろしくお願いします。

ライアン

 
tkuan77:

mladenさん、こんにちは。

しかし、この部分をどこに挿入すればいいのでしょうか?私はまだコーディングの初心者で、Forループがどのように機能するのか理解できないので、このような質問をするのは申し訳ないです。

よろしくお願いします。

ライアン

ライアン

次のような感じです。

if (TimeDayOfYear(TimeCurrent())==TimeDayOfYear(GetLastClosedOrderTime()))。// 取引不可

 
mladen:

ライアン

次のようなものです。

if (TimeDayOfYear(TimeCurrent())==TimeDayOfYear(GetLastClosedOrderTime()))。// 取引不可

こんにちは、mladenさん、コードを追加してみましたが、グローバル変数のエラーが出ているようです。また、MagicNumberという変数が定義されていないようですが、これは何のためにあるのでしょうか?intの下に追加したのですが、その変数の用途がよくわかりません。

アドバイスお願いします。ご迷惑をおかけしますが、よろしくお願いします。

//---- 入力パラメータ

extern double TakeProfit = 1000.0;

extern double Lots = 0.1;

extern double StopLoss = 980.0;

extern int Entry_Hour_1st = 21;

//+------------------------------------------------------------------+

//| エキスパート初期化関数

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| エキスパート初期化関数

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| エキスパートスタート機能

//+------------------------------------------------------------------+

int start()

{

//+------------------------------------------------------------------+

//-- トリガートレード

//+------------------------------------------------------------------+

int ticket, total, MagicNumber;

double TP_Value, SL_Value;

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (オーダーセレクト(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime()。

return(CloseTime);

total = OrdersTotal(); // 現在開いている取引数の合計を確認する

if(total < 1)

{

if (Hour()==Entry_Hour_1st && ((高[0] - 高[1]) > 0.00100) && ((高[1] - 低[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))

{

if ((クローズ[1] - オープン[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]);

SL_Value=(安値[1] - 0.0010)。

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "私のEA",200,0,Green)。

return(0);

}

if ((オープン[1] - クローズ[1]) > 0.00100)

{

TP_Value=(オープン[1]-クローズ[1]);

SL_Value=(安値[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value,「私のEA」,200,0,Green);

return(0);

}

if ((オープン[1] - クローズ[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]);

SL_Value=(安値[1] - 0.0010)。

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "私のEA",200,0,Green)。

return(0);

}

}

if (Hour()==Entry_Hour_1st && ((安値[1] - 安値[0]) > 0.00100) && ((高値[1] - 安値[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))

{

if ((クローズ[1] - オープン[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]);

SL_Value=(High[1]+0.0010)となります。

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "私の EA",200,0,Red);

return(0);

}

if ((オープン[1] - クローズ[1]) > 0.00100)

{

TP_Value=(オープン[1]-クローズ[1])。

SL_Value=(高値[1]+0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "私の EA",200,0,Red);

return(0);

}

if ((オープン[1] - クローズ[1]) <= 0.00100)

{

TP_Value = (高値[1] - 安値[1]);

SL_Value=(高値[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value,「私のEA」,200,0,Red);

return(0);

}

}

}

return(0)。

}

//+------------------------------------------------------------------+

 
tkuan77:

mladenさん、コードを追加したのですが、グローバル変数のエラーが出ているようです。また、MagicNumberという変数が定義されていないようですが、これは何のためにあるのでしょうか?intの下に追加したのですが、その変数の用途がよくわかりません。

アドバイスお願いします。ご迷惑をおかけしますが、よろしくお願いします。

//---- 入力パラメータ

extern double TakeProfit = 1000.0;

extern double Lots = 0.1;

extern double StopLoss = 980.0;

extern int Entry_Hour_1st = 21;

//+------------------------------------------------------------------+

//| エキスパート初期化関数

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| エキスパート初期化関数

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| エキスパートスタート機能

//+------------------------------------------------------------------+

int start()

{

//+------------------------------------------------------------------+

//-- トリガートレード

//+------------------------------------------------------------------+

int ticket, total, MagicNumber;

double TP_Value, SL_Value;

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (オーダーセレクト(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime()。

return(CloseTime);

total = OrdersTotal(); // 現在開いている取引数の合計を確認する

if(total < 1)

{

if (Hour()==Entry_Hour_1st && ((高[0] - 高[1]) > 0.00100) && ((高[1] - 低[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))

{

if ((クローズ[1] - オープン[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]);

SL_Value=(安値[1] - 0.0010)。

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "私のEA",200,0,Green)。

return(0);

}

if ((オープン[1] - クローズ[1]) > 0.00100)

{

TP_Value=(オープン[1]-クローズ[1]);

SL_Value=(安値[1] - 0.0010);

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "私のEA",200,0,Green)。

return(0);

}

if ((オープン[1] - クローズ[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]);

SL_Value=(安値[1] - 0.0010)。

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value,「私のEA」,200,0,Green);

return(0);

}

}

if (Hour()==Entry_Hour_1st && ((安値[1] - 安値[0]) > 0.00100) && ((高値[1] - 安値[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))

{

if ((クローズ[1] - オープン[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]);

SL_Value=(High[1]+0.0010)となります。

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "私の EA",200,0,Red);

return(0);

}

if ((オープン[1] - クローズ[1]) > 0.00100)

{

TP_Value=(オープン[1]-クローズ[1])。

SL_Value=(高値[1]+0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "私の EA",200,0,Red);

return(0);

}

if ((オープン[1] - クローズ[1]) <= 0.00100)

{

TP_Value = (高値[1] - 安値[1]);

SL_Value=(高値[1] + 0.0010);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value,「私のEA」,200,0,Red);

return(0);

}

}

}

return(0)。

}

//+------------------------------------------------------------------+

これは関数 です

start()関数の本体の外に移動させる

 

mladen:

これは関数です

start()関数の本体外に移動させる

こんにちは、mladenさん、私は関数を Start関数の外に移動してみましたが、私のEAは1日に1つの取引しかトリガーしないように制限する代わりに、1日に複数の取引をトリガーしたままです。

ご教示いただきありがとうございます。

ご指摘の通りです。

//---- 入力パラメータ

extern double TakeProfit = 1000.0;

extern double Lots = 0.1;

extern double StopLoss = 980.0;

extern int Entry_Hour_1st = 21;

//+------------------------------------------------------------------+

//| エキスパート初期化関数

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| エキスパート初期化関数

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| エキスパートスタート機能

//+------------------------------------------------------------------+

int MagicNumber;

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (オーダーセレクト(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime()。

return(CloseTime);

}

int start()

{

//+------------------------------------------------------------------+

//-- トリガートレード

//+------------------------------------------------------------------+

int ticket, total;

double TP_Value、SL_Value;

total = OrdersTotal(); // 現在開いているトレードの合計数をチェックする

if(total < 1)

{

if (Hour()==Entry_Hour_1st && ((高[0] - 高[1]) > 0.00100) && ((高[1] - 低[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))

{

if ((クローズ[1] - オープン[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]); // ロングボディの値

SL_Value = (安値[1] - 0.0010); // 常にロングの場合、同じ値

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "私のEA",200,0,Green)。

return(0);

}

if ((オープン[1] - クローズ[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1]); // ショートボディの値

SL_Value = (Low[1] - 0.0010); // 常にロングと同じ値

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "私のEA",200,0,Green)。

return(0);

}

if ((オープン[1] - クローズ[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]); // ヘッドとテールを含むローソク足全体の値

SL_Value = (安値[1] - 0.0010); // ロングでは常に同じ値

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value,「私のEA」,200,0,Green);

return(0);

}

}

if (Hour()==Entry_Hour_1st && ((安値[1] - 安値[0]) > 0.00100) && ((高値[1] - 安値[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))

{

if ((クローズ[1] - オープン[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]); // ロングボディの値

SL_Value = (High[1] + 0.0010); // 常にショートと同じ値

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "私の EA",200,0,Red);

return(0);

}

if ((オープン[1] - クローズ[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1]); // ショートボディの値

SL_Value = (高値[1] + 0.0010); // ショートの場合は常に同じ値

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value, "私の EA",200,0,Red);

return(0);

}

if ((オープン[1] - クローズ[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]); // ヘッドとテールを含むローソク足全体の値

SL_Value = (高値[1] + 0.0010); // ショートの場合は常に同じ値

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Value,Bid-TP_Value,「私のEA」,200,0,Red);

return(0);

}

}

}

return(0)。

}

//+------------------------------------------------------------------+

 
tkuan77:

mladenさん、こんにちは。Start関数の外に関数を移動してみましたが、私のEAは1日に1つの取引しかトリガーしないように制限する代わりに、1日に複数の取引をトリガーするようになりました。

ご教示いただきありがとうございます。

ご指摘の通りです。

//---- 入力パラメータ

extern double TakeProfit = 1000.0;

extern double Lots = 0.1;

extern double StopLoss = 980.0;

extern int Entry_Hour_1st = 21;

//+------------------------------------------------------------------+

//| エキスパート初期化関数

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| エキスパート初期化関数

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| エキスパートスタート機能

//+------------------------------------------------------------------+

int MagicNumber;

datetime GetLastClosedOrderTime()

{

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (オーダーセレクト(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

CloseTime = OrderCloseTime()。

return(CloseTime);

}

int start()

{

//+------------------------------------------------------------------+

//-- トリガートレード

//+------------------------------------------------------------------+

int ticket, total;

double TP_Value、SL_Value;

total = OrdersTotal(); // 現在開いているトレードの合計数をチェックする

if(total < 1)

{

if (Hour()==Entry_Hour_1st && ((高[0] - 高[1]) > 0.00100) && ((高[1] - 低[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))

{

if ((クローズ[1] - オープン[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]); // ロングボディの値

SL_Value = (安値[1] - 0.0010); // 常にロングの場合、同じ値

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "私のEA",200,0,Green)。

return(0);

}

if ((オープン[1] - クローズ[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1]); // ショートボディの値

SL_Value = (Low[1] - 0.0010); // 常にロングと同じ値

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value, "私のEA",200,0,Green)。

return(0);

}

if ((オープン[1] - クローズ[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]); // ヘッドとテールを含むローソク足全体の値

SL_Value = (安値[1] - 0.0010); // ロングでは常に同じ値

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,SL_Value,Ask+TP_Value,「私のEA」,200,0,Green);

return(0);

}

}

if (Hour()==Entry_Hour_1st && ((Low[1] - Low[0]) > 0.00100) && ((High[1] - Low[1]) > 0.00100) && TimeDayOfYear(TimeCurrent()) != TimeDayOfYear(GetLastClosedOrderTime()))

{

if ((クローズ[1] - オープン[1]) > 0.00100)

{

TP_Value = (Close[1] - Open[1]); // ロングボディの値

SL_Value = (高値[1] + 0.0010); // 常にショートと同じ値

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

if ((オープン[1] - クローズ[1]) > 0.00100)

{

TP_Value = (Open[1] - Close[1]); // ショートボディの値

SL_Value = (高値[1] + 0.0010); // ショートの場合は常に同じ値

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

if ((オープン[1] - クローズ[1]) <= 0.00100)

{

TP_Value = (High[1] - Low[1]); // ヘッドとテールを含むローソク足全体の値

SL_Value = (高値[1] + 0.0010); // ショートの場合は常に同じ値

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,SL_Va lue,Bid-TP_Value, "My EA",200,0,Red);

return(0);

}

}

}

return(0)。

}

//+------------------------------------------------------------------+

tkuan77

これを置き換えると.

if(トータル < 1)

を次のように置き換えてください。

if (total < 1 && TimeDayOfYear(GetLastClosedOrderTime()) != TimeDayOfYear(TimeCurrent())) ;

そして、それはこれ以上しないようにする必要があります

 
mladen:

tkuan77

これを置き換えると:

if(合計 < 1)

を次のように置き換えてください。

if (total < 1 && TimeDayOfYear(GetLastClosedOrderTime()) != TimeDayOfYear(TimeCurrent())) ;

そして、これ以上、そんなことをしてはいけない

mladenさん、コードを入力した後、1日1回の取引ではなく、口座が破裂するまで一度に複数の取引が誘発されました。これは、何らかのトリガーメカニズムによるものなのでしょうか?

よろしくお願いします。

 

こんにちは、mladenです。私はこの特定のコードを持っていて、取引を実行した後、持っているすべての保留中の取引を閉じます。

ありがとうございます。

int new_del()

{

int i,a;

int total = OrdersTotal();

文字列コメント,par;

for (i=total-1; i >=0; i--)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if (OrderType()==OP_BUY || OrderType()==OP_SELL)

{

for (a=total-1; a >=0; a--)

{

OrderSelect(a,SELECT_BY_POS,MODE_TRADES);

comentario=OrderComment();

par=StringSubstr(comentario,0,6)。

if(OrderType()==OP_SELLSTOP)// && comentario==Symbol())

{

OrderDelete(OrderTicket());

Print("SELL_STOPを削除"," Ordertype:",OrderType()).Print("SELL_STOP"," Ordertype:",OrderType());

return(1);

if(OrderType()==OP_BUYSTOP)// && par==Symbol())

{

OrderDelete(OrderTicket());

Print("BUY_STOPを削除する"," Ordertype:",OrderType()).Print("BUY_STOP"," Ordertype:",OrderType());

return(1);

}

}

}

}

}

 
tkuan77:
こんにちは、mladen。私はこの特定のコードを持っている私は、貿易を実行した後に持っているすべての保留中の取引を閉じますが、将来のすべての保留中の取引の代わりに、私が取引をトリガした後に私の現在の既存の保留中の取引のみをキャンセルするように設定するにはどうすればよいですか?

ありがとうございます。

int new_del()

{

int i,a;

int total = OrdersTotal();

文字列コメント,par;

for (i=total-1; i >=0; i--)

{

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

if (OrderType()==OP_BUY || OrderType()==OP_SELL)

{

for (a=total-1; a >=0; a--)

{

OrderSelect(a,SELECT_BY_POS,MODE_TRADES);

comentario=OrderComment();

par=StringSubstr(comentario,0,6)。

if(OrderType()==OP_SELLSTOP)// && comentario==Symbol())

{

OrderDelete(OrderTicket());

Print("SELL_STOPを削除"," Ordertype:",OrderType()).Print("SELL_STOP"," Ordertype:",OrderType());

return(1);

if(OrderType()==OP_BUYSTOP)// && par==Symbol())

{

OrderDelete(OrderTicket());

Print("BUY_STOPを削除する"," Ordertype:",OrderType()).Print("BUY_STOP"," Ordertype:",OrderType());

return(1);

}

}

}

}

}

tkuan77

現在の保留中の取引 "と "将来の保留中の取引 "は何を意味するのでしょうか?

 
mladen:

tkuan77

現在の保留中の取引」の意味と「将来の保留中の取引」の意味について教えてください。

mladenさん、こんにちは。

現在の保留中の取引とは、ある条件が満たされると、2つの保留中の取引(ロングとショート)が設定されることを意味します。つまり、ロングトレードがトリガーされた場合、ショートトレードは自動的にキャンセルされます。

将来の取引待ちとは、前の取引待ちをキャンセルした後、再び条件を満たした場合、2つの取引待ち(ロングとショート)をセットすることです。

私がしようとしていることは、取引がトリガーされた後、システムが現在の保留中の取引だけをキャンセルするようにすることです。

よろしくお願いします。