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

 

エラーコード4109

皆さん、こんにちは。

保留中の注文を含むすべての取引を決済するスクリプトを書きましたが、テストした後、がっかりしました。関数はOrderClose と Orderdelete 関数は取引の決済に失敗します。GetLastError関数を 呼び出すと、エラーコードが表示されます。4109はエラーヘッダーファイルでTRADE_NOT_ALLOWEDとして定義されています。

プラットフォームに付属しているこれらのスクリプトも実行してみましたが、成功しませんでした。

誰かがこの問題を解決してくれることを願っています。

ありがとうございます。

ファイル:
closeall2.mq4  2 kb
 

では、これを試してみてください。LotsとPriceの変数は整数ではなくdoubleであるべきだと思います。これが役に立つといいのですが

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

//| CloseAll.mq4 |

//| FX5 |

//| |

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

#property copyright "FX5"

#property link " "

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

//| script program start function |

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

int start()

{

//----

int Ticket,Lots,Price,Type,Result;

int Error=0;

int Total=OrdersTotal();

for(int i=0;i<Total;i++)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==0)

{

Alert("Can''t select the order indexed: ",i);

Alert("Error code is ", GetLastError());

Error++;

}

else

{

/* Lots=OrderLots();

Ticket=OrderTicket();

Type=OrderType();*/

Result=0;

/* if(Type==OP_BUY)

Price=Bid;

if(Type==OP_SELL)

Price=Ask;*/

// if(Type==OP_BUY || Type==OP_SELL)

if(OrderType()<=OP_SELL)

{

Alert(OP_BUY," ",OP_SELL," ",Type);

// Result=OrderClose(Ticket,Lots,Price,5,Blue);

if(OrderType()==OP_BUY) Result=OrderClose(OrderTicket(),OrderLots(),Bid,5,Blue);

if(OrderType()==OP_SELL) Result=OrderClose(OrderTicket(),OrderLots(),Ask,5,Blue);

}

else

{

Result=OrderDelete(OrderTicket());

}

if(Result==0)

{

Alert("Can''t close the Order number: ",i," with Ticket: ",Ticket);

Alert("Error Code: ",GetLastError());

Error++;

}

}

}

if(Error!=0)

Alert(Error," Errors have occured");

else

Alert("Close all Orders Succeeded with no Errors");

//----

return(0);

}

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

試してみる

FX5:
皆さん、こんにちは。

保留中の注文を含むすべての取引を決済するスクリプトを書きましたが、テストしてがっかりしました。関数はOrderCloseとOrderdelete関数が取引の決済に失敗しています。GetLastError関数を呼び出すと、エラーコードが表示されます。4109はエラーヘッダーファイルでTRADE_NOT_ALLOWEDとして定義されています。

プラットフォームに付属しているこれらのスクリプトも実行してみましたが、成功しませんでした。

誰かが問題を解決してくれることを願っています。

ありがとうございます。

メタトレーダーで、ツール→オプション→エキスパートアドバイザータブをクリックし、ライブトレードを許可するを選択し、DLLインポートを 許可するをクリックし、呼び出しを確認するのチェックを外す。私はいくつかのスクリプトを書きましたが、同じ問題を抱えていました。

 
firedave:
よし、これでやってみよう。LotsとPriceは整数ではなく、doubleであるべきだと思います。
//+------------------------------------------------------------------+

//| CloseAll.mq4 |

//| FX5 |

//| |

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

#property copyright "FX5"

#property link " "

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

//| script program start function |

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

int start()

{

//----

int Ticket,Lots,Price,Type,Result;

int Error=0;

int Total=OrdersTotal();

for(int i=0;i<Total;i++)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==0)

{

Alert("Can''t select the order indexed: ",i);

Alert("Error code is ", GetLastError());

Error++;

}

else

{

/* Lots=OrderLots();

Ticket=OrderTicket();

Type=OrderType();*/

Result=0;

/* if(Type==OP_BUY)

Price=Bid;

if(Type==OP_SELL)

Price=Ask;*/

// if(Type==OP_BUY || Type==OP_SELL)

if(OrderType()<=OP_SELL)

{

Alert(OP_BUY," ",OP_SELL," ",Type);

// Result=OrderClose(Ticket,Lots,Price,5,Blue);

if(OrderType()==OP_BUY) Result=OrderClose(OrderTicket(),OrderLots(),Bid,5,Blue);

if(OrderType()==OP_SELL) Result=OrderClose(OrderTicket(),OrderLots(),Ask,5,Blue);

}

else

{

Result=OrderDelete(OrderTicket());

}

if(Result==0)

{

Alert("Can''t close the Order number: ",i," with Ticket: ",Ticket);

Alert("Error Code: ",GetLastError());

Error++;

}

}

}

if(Error!=0)

Alert(Error," Errors have occured");

else

Alert("Close all Orders Succeeded with no Errors");

//----

return(0);

}

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

複数のオーダーを削除する場合は、最後のオーダーから削除する必要があります。

というわけで、" for(int i=0;i=0;i--) "の代わりに、" for(int i=0;i=0;i--) "を使ってみましょう。

 

firedaveさん、コード修正ありがとうございました。小さなバグで、気に留めていませんでした。

Crepuscularさん、ヒントをどうもありがとうございました。解決策を見つけるまで、100年はかかったかもしれません。やっと、動くコードができました。

 

Michelさん、とても気の利いたノートでした、ありがとうございました。

 

最大ドローダウンを取得する関数

決済された取引から最大ドローダウンを取得する関数を書きたいと思っています。

1. 取引がまだアクティブである間にドローダウンを計算する。その数値をグローバル変数に保存し、チケット番号に従ってデータをファイルに書き込む。 MT4は常にオンラインである必要があります。

2. 1分足チャートから最高値または最安値を取得して、ドローダウンを算出する。 (もし、1分足がダウンロードされていなければ、必要な1分足を入手できれば、この方法を使うでしょう)

最大ドローダウンを得るためのより良い方法を考え出したいと思います。

何かご意見があればお願いします。

 
harriss:
私は、クローズしたトレードから最大ドローダウンを取得する関数を書きたいと思っています。

1.トレードがアクティブな状態でドローダウンを計算し、その数値をグローバル変数に保存し、チケット番号に従ってデータをファイルに書き込む。MT4は常にオンラインである必要があります。

2. 1分足チャートから最高値または最安値を取得してドローダウンを得る。ここでの問題は、取引の1分足履歴が必要なこと。(もし、1分足がダウンロードされていなければ、必要な1分足を入手できれば、この方法を使うでしょう)

最大ドローダウンを得るためのより良い方法を考え出したいと思います。

何かご意見がありましたら、お願いします。

サラム・ハリス

ドローダウン」とはどういう意味ですか?

クローズド・トレードの最大損失額という意味でしょうか?

 

ドローダウン

ドローダウンとは、トレードの最下点を意味します。 例えば、トレードがストップロスにヒットした場合、ストップロスがドローダウンになります。 トレードが プラスで終わり、ある時点で-15ピップスであった場合、ドローダウンは15となります。 最後に、取引が-15ピップで終了したが、ある時点で-30ピップスだった場合、ドローダウンは30となります。

 

インジケーターのアラート/アラームのコード化方法について

こんにちは、私はアラートをコード化する方法についてもっと学びたいと思っています。

私はプログラマーではありませんが、頭が良く、一般的に何かをいじり、それを分解し、私が望む方法に近いものを再び組み立てることができます。

私はアラート付きのインジケーターをいくつか調べ、私が見た一般的なアラート機能を、私がアラートを持ちたいと思った他のインジケーターにコピーしてきました。 結果はまちまちでした。

アラートのために呼ばれる主な関数は、Alert()関数、Comment()関数、Playsound()関数 であることに気づきました。 今のところ、私はAlert()関数に最も精通しています。 例えばAlert()とPlaysound()には大きな違いがあるのでしょうか?

私が抱えている一般的な問題は、アラートをどのようにコード化すれば、一方では目立ち、他方ではとんでもなく邪魔にならないのかがわからないということです。 例えば、Alert()関数をクロスで使用していて、インジケータが現在のバーで最終的に印刷されていない場合、アラートは何度も何度も繰り返され、アラートをオフにするのが大変です。 通常、私はチャートの時間枠を変更する必要があります。

まず第一に、現在のバーに対してのみアラートを無効化/非活性化する簡単な方法はありますか?

次に、反復回数を制限したり、アラートに一定の時間を与えるコードを導入することによって、アラートが終わりのない迷惑なものにならないようにコード化する方法はありますか? どのようにコード化するのでしょうか?

私が見た1つの解決策は、常に変化しないように次のバーまでアラートを遅らせることですが、これにはタイムリーでないという欠点があります。

インジケーターのアラームが鳴るのを避けるために、ターミナルウィンドウで設定できる所定の価格アラートを使用したことがありますが、理想的ではありません。

また、Expert Advisorを作成してアラートを出すことができ、そのアラートを簡単にオン/オフできるボタンがあることも知っています。しかし、EAに関して私が抱えている問題は、MetaTraderと同時に実行している別の重要なプログラムが、Expert Advisorが起動すると干渉を受けるようで、動作が重くなることです。

他に解決策はないのでしょうか?

もし、私が列挙した落とし穴を避けるアラートコードを持っていて、コードとアラートの方法の良い例として役立つことができるインジケータがあれば、それを私に参照するか、またはそれを投稿してくださいませんか?

ありがとうございました。