新参者の冒険

 

今ロンドンの午前2時11分です。ここしばらくの間、このmqlの謎を解読しようとしていました。私は今、ロンドンの午前2.11amで、このmqlの謎を解読しようとしています。


私は戦略をコーディングするための初心者の探求にあり、いつものように、これにはプロの助けを必要とします。


下記は私が作成したコードですが、なぜかショートトレードしか実行されません。


その理由がわからず困っています。さらに、こんなことも追加したいのですが。 1.コードは、反対方向の取引がすでに開かれているかどうかに関係なく、ロングとショートの両方の取引を実行する必要があります(例:ロング取引が開かれている場合、コードは条件が満たされていれば、ショートポジションを入力する必要があります)。OrdersTotal()==0;関数で遊んでみる必要がありそうですが、どうすればいいのかわかりません。


どうか助けてください。(添付しようとしたのですが、なぜか添付できません。どうなっているのでしょうか?)


このコードを実現するために私を最も助けてくれた人には、良いシャンパンのボトルをあげることを約束します :-)


ps:私はこれをmt4シミュレータ/ストラテジーテスターでテストしています。


あなたの助けを期待しています。

ニック

 
//+------------------------------------------------------------------+
//|                                     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の基準に従います。









 
niko:
これがそのコードです。

ロングオーダーを行わない理由は、ショートオーダーを実行するコードブロックを閉じ角括弧で閉じていないからです。つまり、(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

 
おっと、回答に必要な時間で、他の方の方が早くなってしまいました・・・。
 
TuRRiCAN wrote>>
おっと、回答に必要な時間で、他の方の方が早かった・・・。

こんにちは、Tourricanさん、とても助かりました。私はロシア人でシベリア出身です。

私はmqlの本を勉強しましたが、それはまだ実践的な学習の範囲外です、それを勉強することと、自分でプログラムを書こうとすることは全く別のことです(本のそれぞれの部分で、なぜ、どのようにそれらが使われるのか、実際の例で明確に説明されていないので、分かりますよね。

でも、なんとかなるさ。この仕事をやり遂げたいという私の中の熱い思いは、どんな障害よりも大きいんだ。

 
niko:

皆さんは、ライブのマーケットを独立してトレードしているのですか、それともmetaquotesのために働いているのですか?

あなたの質問に答えるなら、私は通常、ヘリのパイロットとして働いています。しかし、経済状況を考えると、私が勤めている会社は、現在、飛行機を飛ばしたくありません。そこで、暫定的に、私の親友が経営する会社のためにEAを開発しています。私たちは、かなり有名なファンドに代わってライブトレードを行っています。

私はあなたがコードを学ぶためにしようとしていることを嬉しく思いますし、これまで私ができるときにお手伝いします。その爽やかな誰かがフォーラムに参加し、自給自足することを学びたい見つけること。