//+------------------------------------------------------------------+ //| N&P 1DailyUpTrendExec.mq4 | //| Copyright Nick Lou & Pete Arh 2009 | //| 20090523 | //| | //+------------------------------------------------------------------+ extern double Lots=0.01; extern double TakeProfit=20; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if(Bars<75) { Print("Bars less than 100"); return(0); } //Declaration double ema1, ema2, ema3, closeup, e1over2, e2over3, e1under2, e2under3; ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0); ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0); ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0); e1under2= ema1< ema2; e2under3= ema2< ema3; e1over2= ema1> ema2; e2over3= ema2> ema3; if(OrdersTotal()==0) // one order at the time { // Short Entry static int ticket; if( e1under2 && e2under3) // short function { ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red); if( ticket>0) { if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice()); } if(OrdersTotal()==0) // one order at the time if( e1over2 && e2over3) //this may be messy cos old version had ==1 for all variables { if( e1over2 && e2over3) //buy function ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green); //What's 12345 for? I ADDED ASk-30*Point for stop loss if( ticket>0) { if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } return(0); } return(0); } }これがコードだ!
すごい!初心者」にしては、なかなか良いコーディングですね。私よりもずっと簡潔にコードを書くことができますね。
BUYセクションには2つの同じconditional-if行があるのに対し、SELLセクションには1つしかありませんね。
BUY関数の 2つ目の同じ条件if文は、おそらく無害だと思いますが、必要なのでしょうか?
if(OrdersTotal()==0) //一度に一つの注文
if(e1over2 && e2over3) //これは面倒かもしれない cos 古いバージョンではすべての変数に==1があった <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<!
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
I ADDED ASk-30*Point for Stop loss
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order :",GetLastError());
return(0);
}
また、売りと買いの両方の関数が同じConditional-if内に含まれているようです:
if(OrdersTotal()==0) //
{
// ショートエントリー
static int ticket;
if(e1under2 && e2under3) // ショート関数
{ // このためのマッチングブラケットは、SELLとBUY関数のずっと下にある<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<下記参照
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point, "ショートオーダー ",0,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("SHORT order opened : ",OrderOpenPrice());
}
if(OrdersTotal()==0):一度に1つの注文を出す。 //一度に一つの注文
if(e1over2 && e2over3) //これは面倒かもしれない cos 古いバージョンではすべての変数に ==1 があった
{
if(e1over2 && e2over3) //買い機能
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,」,0,0,Green); //何のための12345なのか?I ADDED ASk-30*Point for Stop loss
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order :",GetLastError());
return(0);
}
return(0);
}. // これは上に示したものと一致するブラケットです<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 上記参照
return(0);
}
}
BUY注文は、あなたが指摘したconditional-ifを配置した方法で、SELLの基準に従います。
これがそのコードです。
ロングオーダーを行わない理由は、ショートオーダーを実行するコードブロックを閉じ角括弧で閉じていないからです。つまり、(e1under2 && e2under3) AND(e1over2 && & e2over3) の場合にのみロングオーダーを実行することに なりますが、私はそうはならないと想像して います。
すでに反対方向の注文がある場合でも、注文を出したいと言っていますね。このことから、注文数は 各方向に最大1つずつに制限したいのだと思います。OrdersTotal()が0に等しいというチェックを入れることで、各方向に1つではなく、合計1つの注文に効果的に制限することができます。必要なのは、ループとカウンターを使用して既存の注文の数と種類をチェックし、その結果を使用して注文を行うべきかどうかを決定することです。
他の投稿で、MQLの書き方を学びたいとおっしゃっていたので、私はあなたのためにこれを書くつもりはありません。この例は、まさに学習プロセスに不可欠なシンプルなコードとロジックです。
ぜひ、自分でやってみて、どうなったか教えてください。
皆さん、レジェンドです!!!
FXTrader2008 と cloudbreaker のコメントありがとうございます。買いの繰り返し条件があることに気がつかなかったので、それをカットしました。私は自分でコードを学びたいので、コード化された答えを与えないのは良いアイデアです。ループやカウンタについてはネットで調べてみます。
このコードがコンパクトで素晴らしいのは、私の友人(プログラマー)がそれをまとめるのを手伝ってくれたからです。
私の方で進めてみて、行き詰まったらまたお知らせしますね。
皆さんは、ライブのマーケットを独自にトレードしているのですか、それともmetaquotesのために働いているのでしょうか?
あなたのコードを深く見ていないのですが、最初のヒントを一つ。
コードをもっと明確に構成するようにしましょう。私たちがこれを行うのは、楽しむためではなく、読みやすく、理解しやすくするためです。コードの「センス」や「意味」には何の影響も与えません...。
では、あなたのコードがどうあるべきかを見てみましょう(重要な部分のみ)。
if(OrdersTotal()==0) // one order at the time
{
// Short Entry
static int ticket;
if( e1under2 && e2under3) // short function
{
ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red);
if( ticket>0)
{
if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice());
}
if(OrdersTotal()==0) // one order at the time
if( e1over2 && e2over3) //this may be messy cos old version had ==1 for all variables
{
if( e1over2 && e2over3) //buy function
ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green); //What's 12345 for? I ADDED ASk-30*Point for stop loss
if( ticket>0)
{
if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
return(0);
}
return(0);
}
これでお分かりのようにshort "条件のテストだけを行い
// Short Entry
static int ticket;
if( e1under2 && e2under3) // short function
そして、その内部で「長い」条件を2回テストしている - セキュリティのために ; ) - これはうまくいかない。
if( e1over2 && e2over3) //this may be messy cos old version had ==1 for all variables
{
if( e1over2 && e2over3) //buy function
良くなった。(ただし、完璧には程遠い)
if(OrdersTotal()==0) // one order at the time
{
// Short Entry
static int ticket;
if ( e1under2 && e2under3) // short function
{
ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"Short Order ",0,0,Red);
if ( ticket>0)
{
if (OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("SHORT order opened : ",OrderOpenPrice());
} }
if( e1over2 && e2over3) //buy function {
ticket=OrderSend(Symbol(),OP_BUY, Lots,Ask,0,0,Ask+ TakeProfit*Point,"",0,0,Green); //What's 12345 for? I ADDED ASk-30*Point for stop loss
if ( ticket>0)
{
if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
}
return(0);
}
これでショートもロングもうまくいくはずです。
私は非常にMQL4についてここにこの本を読むことをお勧めします - 特にセクション通常のプログラムの作成- それは非常に良い書かれており、あなたは簡単にあなたの戦略を実装することができます。私もそう始めました。
もしそこでファイルをダウンロードして、コメントに問題がある場合(キリル文字なので)、「ワード」を開き、各ファイルのソースをインターネットのページから(そこのコメントは英語なので)ワードにコピー&ペーストし、最後にワードからMetaeditorにコピー&ペーストしてください。これで、英語でプログラムを勉強することができます。
お役に立てるといいのですが・・・。
(ところで。私もMQL4の初心者ですが、プログラマーとして働いているので、構文や構造は問題ありません...)
ご挨拶 TuRRiCAN
皆さんは、ライブのマーケットを独立してトレードしているのですか、それともmetaquotesのために働いているのですか?
あなたの質問に答えるなら、私は通常、ヘリのパイロットとして働いています。しかし、経済状況を考えると、私が勤めている会社は、現在、飛行機を飛ばしたくありません。そこで、暫定的に、私の親友が経営する会社のためにEAを開発しています。私たちは、かなり有名なファンドに代わってライブトレードを行っています。
私はあなたがコードを学ぶためにしようとしていることを嬉しく思いますし、これまで私ができるときにお手伝いします。その爽やかな誰かがフォーラムに参加し、自給自足することを学びたい見つけること。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
今ロンドンの午前2時11分です。ここしばらくの間、このmqlの謎を解読しようとしていました。私は今、ロンドンの午前2.11amで、このmqlの謎を解読しようとしています。
私は戦略をコーディングするための初心者の探求にあり、いつものように、これにはプロの助けを必要とします。
下記は私が作成したコードですが、なぜかショートトレードしか実行されません。
その理由がわからず困っています。さらに、こんなことも追加したいのですが。 1.コードは、反対方向の取引がすでに開かれているかどうかに関係なく、ロングとショートの両方の取引を実行する必要があります(例:ロング取引が開かれている場合、コードは条件が満たされていれば、ショートポジションを入力する必要があります)。OrdersTotal()==0;関数で遊んでみる必要がありそうですが、どうすればいいのかわかりません。
どうか助けてください。(添付しようとしたのですが、なぜか添付できません。どうなっているのでしょうか?)
このコードを実現するために私を最も助けてくれた人には、良いシャンパンのボトルをあげることを約束します :-)
ps:私はこれをmt4シミュレータ/ストラテジーテスターでテストしています。
あなたの助けを期待しています。
ニック