新参者の冒険 - ページ 4

 

こんにちは、mqlの伝説です。会社の昼休みに疑似コードを作ってみました。何が足りないか教えてくれたら、追加しますよ。

N&P疑似コード
このストラテジーでは、1つのコードで、どのチャートにも貼り付けることができ、5つの通貨で実行され、ルールが満たされていれば、それぞれの通貨でショートとロングの両方のポジションを取ることができるようにしたいと思います。
---EURUSD---
ema7>ema14>sma50 で PriceNow が < TopFilterLevel (例: eurusd の場合は 1.3080. これは日次で調整します) であれば
EURUSD Lotsを買う(lotsは外部変数で、例えば0.01)。そうでない場合。(すなわち、条件が満たされない) 買わない。

ema7<ema14<sma50でPriceNowが> BottomFilterLevel (例:EURSDの場合1.1508) ならば。
EURUSDのロットをショートする(これも外部変数)。Else (すなわち、条件を満たさない場合はショートしない).

BUYポジションがエントリーポイントから20pipsに達した場合。EURUSDでTAKEPROFIT。
もしショートポジションがエントリーポイントから20pipsに達したら。EURUSDでTAKEPROFIT。
20pipsに達しない場合(買いでも売りでも)、ポジションが閉じられるまで市場にい続けます。

を手作業で作ってみました。(理想を言えば、コードを短くするために、これをOrderSend 関数に入れる)。

----GBPUSD---
上記と全く同じコードです。

----USDJPY--- 上記と全く同じコードです。
上記と同じ

----USDCHF--- 上記と同じ
上記と同じ

---AUDUSD---
上記と同じ

**コードの詳細
上記の条件を満たしていれば、どの通貨でも買いと売りの両方を同時に実行することができます。
***このコードではストップロスは必要ありません。

**マネーマネジメントのコードはありません

さて、これはどのように見えるのでしょうか?

 
niko:

こんにちは、mqlの伝説です。会社の昼休みに疑似コードを作ってみました。何が足りないか教えてくれたら、追加しますよ。

N&P疑似コード
このストラテジーでは、1つのコードを持ち、どのチャートにも貼り付けることができ、5つの通貨で実行し、ルールが満たされていれば、それぞれでショートとロングの両方のポジションを取りたいと考えています。
---EURUSD---
ema7>ema14>sma50 で PriceNow が < TopFilterLevel (例: eurusd の場合は 1.3080. これは日次で調整します) であれば
EURUSD Lotsを買う(lotsは外部変数で、例えば0.01)。そうでない場合。(すなわち、条件が満たされない) 買わない。

ema7<ema14<sma50でPriceNowが> BottomFilterLevel (例:EURSDの場合1.1508) ならば。
EURUSDのロットをショートする(これも外部変数)。Else (すなわち、条件を満たさない場合はショートしない).

BUYポジションがエントリーポイントから20pipsに達した場合。EURUSDでTAKEPROFIT。
ショートポジションがエントリーポイントから20pipsに達した場合。EURUSDでTAKEPROFIT。
20pipsに達しない場合(買いでも売りでも)、ポジションが閉じられるまで市場にい続けます。

を手作業で作ってみました。(理想を言えば、コードを短くするために、これをOrderSend 関数に入れる)。

----GBPUSD---
上記と全く同じコードです。

----USDJPY--- 上記と全く同じコードです。
上記と同じ

----USDCHF--- 上記と同じ
上記と同じ

---AUDUSD---
上記と同じ

**コードの詳細
上記の条件を満たしていれば、どの通貨でも買いと売りの両方を同時に実行することができます。
***このコードではストップロスは必要ありません。

**マネーマネジメントのコードはありません

で、これはどう見える?

コーディングの基本的なチュートリアルは、私の頭の中を整理するのにとても役に立ちました(詳細なコーディング部分は不足していますが)。私が忙しかったことを示すために、下にコードを添付します。アイデアはあると思いますが、まだ多くのエラーを返します。Start()の中で、すべてが1つの大きな括弧の中にあるのがわかると思いますが、なぜそうしたかというと、mqlが変数をグローバルに宣言できないというエラーを返し続けていたからです。メモ帳++を使って、ブラケットの位置を確認しました。それで、私は少なくともこれで正しい道を進んでいるのでしょうか?

//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


   //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }


   // Order counting code
   // Return:  0 = no orders
   //          >0 = # long orders
   //          <0 = # short orders
      int CalcOpenOrders()
         {
         int long=0,short=0;
      for(int i=0; i<OrdersTotal(); i++)   
         //i set to 0 to stop bugs from
         //crawling in, i<Orderstotal means if i is behind the number of orders
         //in market then start counting orders and make i that number
         {
         if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES)==false)break;
         //this function selects an order for further processing
         if(OrderType()==OP_BUY)long++;
         if(OrderType()==OP_SELL)short++;
         }
      if(long>0)return(long);
      if(short>0)return(-short);
      }

//------------ (fingers crossed this is right). I still don't get it why we need to count orders.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1, ema2, ema3, closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
   {
   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(Bars<75)
      {
      Print("Bars less than 100");
      return(0);
      }


   //------------------EURUSD Block-------------------------
   //check order type, if it doesn't equal to buy already then buy


   //here i am setting a condition which will be
   //checked before a trade is opened, it shoudl state 'It's okay to enter
   //into long trade so long as there is either 1 order in place already or
   //none)
  
   // Call function. the returnvalue (output) of the function is stored into ReturnVal
   int ReturnVal = CalcOpenOrders();
  
   // Check output of function
   if ( ReturnVal >0)  // >0 = long orders. See CalcOpenOrders() 
      eurusdbuyok=1;
      else
      {
      eurusdbuyok=0;
      return(0);
      }

   if ( ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
      eurusdshortok=1;
      else
      {
      eurusdshortok=0;
      return(0);
      }


   //--------------condition ends

   if( eurusdshortok==1)
      {
      static int ticket;
      // deleted if(OrdersTotal()==0)
      if( e1under2 && e2under3)     // short function
         {
         ticket=OrderSend(Symbol(),OP_SELL, Lots,Bid,0,0,Bid- TakeProfit*Point,"ShortOrder ",0,0,Red);
         if( ticket>0)
            {
            if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
            Print("SHORT order opened : ",OrderOpenPrice());
            }
         }
      return(0);
      }



   //  -------------------------------------------------------------------------------------------
   if ( eurusdbuyok==1)
      {
      static int ticket1;
      // deleted if(OrdersTotal()==0)
      if( e1over2 && e2over3 && eurusdbuyok==1) //buy function
         {
         ticket1=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( ticket1>0)
            {
            if(OrderSelect( ticket1, SELECT_BY_TICKET, MODE_TRADES))
            Print("BUY order opened : ",OrderOpenPrice());
            }
         }
      return(0);
      }

   return(0);
   } 
これはコードの最新バージョンです。構文的にはすべてOKのようですが、strategy testerで実行するとトレードが返されません。私は今、コードにかなり慣れてきています。
 
niko wrote>>

こんにちは、mqlの伝説です。会社の昼休みに疑似コードを作ってみました。何が足りないか教えてくれたら、追加しますよ。

N&P疑似コード
この戦略では、1つのコードを持ち、どのチャートにも添付することができ、5つの通貨で実行し、ルールが満たされていれば、それぞれの通貨でショートとロングの両方のポジションを入力したいのですが、どうすればいいですか?
---EURUSD---
ema7>ema14>sma50 で PriceNow が < TopFilterLevel (例: eurusd の場合は 1.3080. これは日次で調整します) であれば
EURUSD Lotsを買う(lotsは外部変数で、例えば0.01)。そうでない場合。(すなわち、条件が満たされない) 買わない。

ema7<ema14<sma50でPriceNowが> BottomFilterLevel (例:EURSDの場合1.1508) ならば。
EURUSDのロットをショートする(これも外部変数)。Else (すなわち、条件を満たさない場合はショートしない).

BUYポジションがエントリーポイントから20pipsに達した場合。EURUSDでTAKEPROFIT。
ショートポジションがエントリーポイントから20pipsに達した場合。EURUSDでTAKEPROFIT。
20pipsに達しない場合(買いでも売りでも)、ポジションがクローズされるまで市場にい続けること。

を手作業で作ってみました。(理想を言えば、コードを短くするために、これをOrderSend 関数に入れる)。

----GBPUSD---
上記と全く同じコードです。

----USDJPY--- 上記と全く同じコードです。
上記と同じ

----USDCHF--- 上記と同じ
上記と同じ

---AUDUSD---
上記と同じ

**コードの詳細
上記の条件を満たしていれば、どの通貨でも買いと売りの両方を同時に実行することができます。
***このコードではストップロスは必要ありません。

**マネーマネジメントのコードはありません

というわけで、こんな感じでしょうか?

Nikoさん、こんにちは。

あなたの擬似コードは、最初の試みとしてはかなり良いように見えます。

しかし、私はもう少し構造化されたものを見たいと思いますし、私にとっては2つの疑問が生じます。

私は、このコードを、私が通常使用するような形式に簡単に素早くまとめることができました。テキストファイルとしてここに添付しましたので、ご覧ください。このファイルを保存して、メモ帳などのエディターで開くと、書式が表示されます。

この段階では、特定のコンピュータ言語で書いているわけではないことに注意してください。私たちは、何をしようとしているのかを明確に、曖昧さなく指定しようとしているだけなのです。

この疑似コードは、かなり具体的で「法律的」であることにお気づきでしょう。これは、コンピュータとの対話の仕方です。コンピュータに何をさせたいのかを明確に示す必要があるのです。そうでないと、コンピュータはゴミを生成する傾向があります。

また、「ブロック」を使って、論理的なグループに分けていることにもお気づきでしょう。これは後々、コードを適切に構造化するために役に立つかもしれません。この議論の中で誰かが指摘したように、私たちは単に楽しむためにこのようなことをしているのではありません。コードをより読みやすく、より理解しやすく、より保守しやすく、そして最終的にはより信頼性の高い、バグのないものにするために行うのです。後者は、ライブ・トレーディングに使用されるソフトウェアにおいて非常に重要であり、もちろん、捨てられるだけの資金がある場合は別ですが :).まじめな話、バグだらけのソフトウェアに対処しなくても、取引は十分に難しいのです。

私が送ったものを見て、あなたが必要だと思う変更を自由に行ってください。私の疑似コードには、いくつかの重要な点が欠けています。あなたはそれを見つけることができますか?

また、私が擬似コードで提起した2つの質問にも対処したいと思うかもしれません。他にもいろいろな疑問が浮かんできますが、それは実際のコーディングの段階まで残しておいたほうがいいでしょう。

FXtrader2008が以前に紹介したNotepad++エディタをまだ試していないのであれば、試してみるのもよいでしょう。また、より簡単に使用できるツールがあれば、それを使用することもできます。修正した疑似コードをテキストファイルの添付ファイルとして私に送ってください。このHTMLエディタで構造化されたコードを書こうとすると、疑似であれ何であれ、少し退屈で面倒だと思います。

よろしくお願いします。

ティム

ファイル:
 
TSWilson:

Nikoさん、こんにちは。

あなたの擬似コードは、最初の試みとしてはかなり良いように見えます。

しかし、私はもう少し構造化されたものを見たいと思いますし、私にとってはいくつかの疑問が生じます。

私は、このコードを、私が通常使用するような形式に、簡単に素早くまとめることができました。テキストファイルとしてここに添付しましたので、ご覧ください。このファイルを保存して、メモ帳などのエディターで開くと、書式が表示されます。

この段階では、特定のコンピュータ言語で書いているわけではないことに注意してください。私たちは、何をしようとしているのかを明確に、曖昧さなく指定しようとしているだけなのです。

この疑似コードは、かなり具体的で「法律的」であることにお気づきでしょう。これは、コンピュータとの対話の仕方です。コンピュータに何をさせたいのかを明確に示す必要があるのです。そうでないと、コンピュータはゴミを生成する傾向があります。

また、「ブロック」を使って、論理的なグループに分けていることにもお気づきでしょう。これは後々、コードを適切に構造化するために役に立つかもしれません。この議論の中で誰かが指摘したように、私たちは単に楽しむためにこのようなことをしているのではありません。コードをより読みやすく、より理解しやすく、より保守しやすく、そして最終的にはより信頼性の高い、バグのないものにするために行うのです。後者は、ライブ・トレーディングに使用されるソフトウェアにおいて非常に重要であり、もちろん、捨てられるだけの資金がある場合は別ですが :).まじめな話、バグだらけのソフトウェアに対処しなくても、取引は十分に難しいのです。

私が送ったものを見て、あなたが必要だと思う変更を自由に行ってください。私の疑似コードには、いくつかの重要な点が欠けています。あなたはそれを見つけることができますか?

また、私が擬似コードで提起した2つの質問にも対処したいと思うかもしれません。他にもいろいろな疑問が浮かんできますが、それは実際のコーディングの段階まで残しておいたほうがいいでしょう。

FXtrader2008が以前に紹介したNotepad++エディタをまだ試していないのであれば、試してみるのもよいでしょう。また、より簡単に使用できるツールがあれば、それを使用することもできます。修正した疑似コードをテキストファイルの添付ファイルとして私に送ってください。このHTMLエディタで構造化されたコードを書こうとすると、疑似であれ何であれ、少し退屈で面倒だと思います。

よろしくお願いします。

ティム

やあ、TSW。これはありがとうございます。あなたがこれにかなりの時間を費やしたのがわかるので、本当に感謝しています。私は更新された疑似コードを添付しましたが、添付されなかった場合のために、以下にそれを示します。私はあなたが見逃しているものを見ようとしましたが、よく分かりませんでした、私はいくつかのものを追加しましたが、それは単に物事の明確化でした。


ここから先は?この「適切な」コードを作成する一方で、私はまだ上のコードのパズルを解こうとしています。これは古いパッチを当てたコードなので、私たちの疑似コードには従っていませんが、少なくとも1つの通貨については動作するはずなので、まだかなり困惑しています。重要なのは、このような無秩序な方法で構築することで、実際のコーディング要素(括弧がスクリプトにどのように影響するか、どこで変数を宣言するかなど)を学ぶことができることです。なぜそのコードが今のように動かないのか、何かアイデアはありませんか?

Program Title  - N&P Pseudo Code

START BLOCK - List of Currency Pairs

     EURUSD
     GBPUSD
     USDJPY
     USDCHF
     AUDUSD

END BLOCK - List Of Currency Pairs



START BLOCK - Configuration Parameters

      Set the value of TopFilterLevel manually on a daily basis for EURUSD
      Set the value of BottomFilterLevel manually on a daily basis EURUSD
      Set the value of TopFilterLevel manually on a daily basis for GBPUSD
      Set the value of BottomFilterLevel manually on a daily basis GBPUSD

      Set the value of TopFilterLevel manually on a daily basis for USDJPY
      Set the value of BottomFilterLevel manually on a daily basis USDJPY
      Set the value of TopFilterLevel manually on a daily basis for USDCHF
      Set the value of BottomFilterLevel manually on a daily basis USDCHF

      Set the value of TopFilterLevel manually on a daily basis for AUDUSD
      Set the value of BottomFilterLevel manually on a daily basis AUDUSD

      Set Lot size manually for All positions at once (same lot size)

END BLOCK - Configuration Parameters



START BLOCK  - Entry Rules

     If   the 7 Period Exponential Moving Average is greater than the 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is greater than the  50 period Simple Moving Average       AND
          Current Price   is less than TopFilterLevel  THEN
                       Signal a  BUY (Long) entry condition

     If   the  7 Period Exponential Moving Average is less than 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is less than the 50 period Simple Moving Average       AND
          Current Price   is less than  BottomFilterLevel  THEN
                       Signal a  SELL (Short) entry condition

     ***  Question ***
      What time periods do you want to use for your moving averages? Are the periods  Minutes, Hours, Days, Weeks, Months or  do they need to be variable?
***Answer *** Excellent question. It will be 5 minute periods for all moving averages, they do not need to be variable.

END BLOCK - Entry Rules
      


START BLOCK - Manual Close

      **** Question ***
      You say 
                  "Keep being in the market until the position is closed manually.
                   (ideall we put this into OrderSend function to keep code shorter)."
       
       What exactly do you want the program to do in this block?

***I was unclear on this before, my apologies. There should be no block as this in the code. I will exit positions manually when needed through the trade/terminal window (I assume that’s possible and won’t mess up the EA execution, right). So actually I don’t know if we need to code this flexibility or not? What do you think

END BLOCK - Manual Close  



START BLOCK  - Exit Rules

     If  any Open Position is greater than or equal to 20 pips from the entry level THEN
        Close the Position

END BLOCK  - Exit Rules



START BLOCK - Main  - This block controls the whole flow of the program
         With each Currency Pair in the List of Currency Pairs block do all of the following

                  Process the Exit Rules Block - 
                                    (Note that in practice this would normally just be the automatic execution of a Take Profit  Stop
                                    but we should mention it here in the pseudo code for completness. Of course you may have something else in mind
                                    such as using the program to close an open position—nope not for this code.)
                  Check the Entry Rules block  to see if a BUY or SELL  condition exists for this Currency Pair 

                  Check to see if  there is already  an open  BUY  position for this Currency Pair
                  Check to see if  there is already  an open SELL  position for this Currency Pair

                  If there is no open BUY position  for this currency pair   AND
                      a Buy condition exixts for this currency pair THEN
                              Open a BUY Position  for this currency pair
				Size: Pre-determined Lots

ELSE		If there is already 1 open BUY position for this currency pair		DO NOT OPEN BUY Position for this currency pair.

                   If there is no open SELL position  for this currency pair   AND
                      a SELL condition exixts for this currency pair THEN
                              Open a SELL Position  for this currency pair 
				Size predetermined lots.
  
ELSE		If there is already 1 sell position open for this currency pair		Do not open SELL Positions for this currency pair     
              
END BLOCK - Main 




PS: I will often use just 1 direction on a currency pair (eg: just short, for eurusd for 2 days for instance). How could we build this into the code. My assumption is I could just put ‘//’ infront of the parts of the code I don’t want to use (Eg: infront of buy or sell orders within each currency pair) and then remove them when I need to use that part of code next time. Will this work with a code structured in this way? 

**I can’t really think of anything you left out on purpose, to be honest. Unless it’s to check if there are sufficient funds for the trade, but that’s not necessary yet. Maybe in future versions of the strategy.
 
niko wrote>>

やあみんな、コーディングに関する基本的なチュートリアルは、私の頭を本当に助けてくれたよ(詳細なコーディング部分は不足しているけどね)。私が忙しかったことを示すために、以下のコードを添付します。アイデアはあると思うのですが、まだたくさんのエラーを返しています。Start()の中で、すべてが1つの大きな括弧の中にあるのがわかると思いますが、なぜそうしたかというと、mqlが変数をグローバルに宣言できないというエラーを返し続けていたからです。メモ帳++を使って、ブラケットの位置を確認しました。それで、私は少なくともこの方法で正しい方向に進んでいるのでしょうか?

これはコードの最新バージョンです。構文的にはすべてOKのようですが、strategy testerで実行するとトレードが返されません。私は今、コードにかなり精通してきています、まあ、プログラム側の構造です。

ヘイ、みんな、上記のコード(疑似コードではなく、コードコード)について、適切な方法を学んでいる間、何か手助けがあれば教えてください。

多分、注文をカウントする関数が1つで、その代わりに2つの関数が必要なのだと思います。私は以下のコードをプログラムしました(これを考慮し、いくつかの点を変更しました)、以下を参照してください。しかし、私はまだ完全な初心者なので、まだそれはすべて台無しになりました。この件に関して何かアイデアがあれば教えてください。

//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


  //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}


  // Order counting code
  // Return:  0 = no orders
  //          >0 = # long orders
  //          <0 = # short orders
     int CalcOpenOrders()
        {
        int long=0,short=0;
     for(int i=0;i<OrdersTotal();i++)
        //i set to 0 to stop bugs from
        //crawling in, i<Orderstotal means if i is behind the number of orders
        //in market then start counting orders and make i that number
        {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
        //this function selects an order for further processing
        if(OrderType()==OP_BUY)long++;
        if(OrderType()==OP_SELL)short++;
        }
     if(long>0)return(long);
     if(short>0)return(-short);
     }

//------------ (fingers crossed this is right). I still don't get it
why we need to count orders.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1,ema2,ema3,closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
  {
  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(Bars<75)
     {
     Print("Bars less than 100");
     return(0);
     }


  //------------------EURUSD Block-------------------------
  //check order type, if it doesn't equal to buy already then buy


  //here i am setting a condition which will be
  //checked before a trade is opened, it shoudl state 'It's okay to enter
  //into long trade so long as there is either 1 order in place already or
  //none)

  // Call function. the returnvalue (output) of the function is
stored into ReturnVal
  int ReturnVal = CalcOpenOrders();

  // Check output of function
  if (ReturnVal >0)  // >0 = long orders. See CalcOpenOrders()
     eurusdbuyok=1;
     else
     {
     eurusdbuyok=0;
     return(0);
     }

  if (ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
     eurusdshortok=1;
     else
     {
     eurusdshortok=0;
     return(0);
     }


  //--------------condition ends

  if(eurusdshortok==1)
     {
     static int ticket;
     // deleted if(OrdersTotal()==0)
     if(e1under2 && e2under3)     // short function
        {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"ShortOrder
",0,0,Red);
        if(ticket>0)
           {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
           Print("SHORT order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }



  //  -------------------------------------------------------------------------------------------
  if (eurusdbuyok==1)
     {
     static int ticket1;
     // deleted if(OrdersTotal()==0)
     if(e1over2 && e2over3 && eurusdbuyok==1) //buy function
        {
        ticket1=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(ticket1>0)
           {
           if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES))
           Print("BUY order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }

  return(0);
  }

 
niko wrote>>

皆さん、上記のコード(疑似コードではなく、コードコード)について、適切な方法を学んでいる最中ですが、何かお手伝いできることはありますか?

多分、注文をカウントする関数が1つで、代わりに2つの関数が必要なのだと思います。私は以下のコードをプログラムしました(これを考慮し、いくつかの点を変更しました)、以下を参照してください。しかし、私はまだ完全な初心者なので、まだそれはすべて台無しになりました。この件に関して何かアイデアがあれば教えてください。

こんにちは、Nikoさん

擬似コードを参考にすると

コードから
***質問 ***
移動平均に使用する時間帯は何ですか?分、時間、日、週、月、またはそれらは可変である必要がありますか?
***回答 *** 素晴らしい質問です。全ての移動平均で5分足となり、可変である必要はありません。

それから、設定パラメータ領域の疑似コードに次のような文を追加することをお勧めします。

"インディケータに5分足タイムフレームを使用する"


とおっしゃっていますね。
***以前は不明瞭でした、申し訳ございません。このようなブロックは、コードにはないはずです。

必要な時にトレード/ターミナルウィンドウから手動でポジションを終了させる

(可能で、EAの実行を混乱させることはないと思っています。)

というわけで、実はこの柔軟性をコード化する必要があるかどうかわからないのです。あなたはどう思いますか?


それから、このブロックを疑似コードから削除することを提案します。

ターミナルを使用して手動でポジションを閉じることができるようにEAをコーディングすることに問題はないはずですが、何も台無しにすることはありません。

あなたは以下の行を追加しました。

ELSE この通貨ペアですでに1つの買いポジションがある場合、この通貨ペアの買いポジションを開けないようにします。

ELSE この通貨ペアですでに1つの売りポジションが開いている場合、この通貨ペアで売りポジションを開かないでください。


*** 質問 *** なぜ、前の行の後に、プログラムにさせたくないことを具体的に記述する必要があるのでしょうか。

というように、プログラムに何をさせたいかを記述します。私の考えでは、疑似コードはロジックを慎重に考え抜く場所です。そうでなければ、次のようなことが起こり得ます。

実際のコーディングを始めると、混乱に陥ります。


とおっしゃっています。
PS:私は頻繁に通貨ペアでちょうど1方向を使用します(例:ちょうどショート、例えば2日間ユーロのために)。どのようにしてこれをコードに組み込むことができるでしょうか。私の仮定では、私が使用したくないコード部分(例:各通貨ペアの買いまたは売り注文の前)の前に'//'を置き、次にそのコード部分を使用する必要があるときにそれを削除することができます。このように構成されたコードでうまくいくのでしょうか?


あなたが提案するようにコードをコメントアウトすることは、あまりエレガントな方法とは言えません。さらに、例えばコードの「LONG」セクションをコメントアウトすると、多くの重複するコードを作成しない限り、すべての通貨ペアでロングポジションを開くための関数をコメントアウトすることになります。これはまた、非常にエレガントな方法ではなく、簡単にエラーを引き起こします。

ある期間、EURUSDをロング、GBPUSDをショートし、USDCHFを全く取引しないようにしたいと思うかもしれません。これは非常に簡単に実現できることですが、疑似コードでどのように記述するかを自分で考えてみてほしいのです。


ここで、一つの可能性のある方法として、いくつかのヒントを挙げておきます。

1. レベルがどのように設定され、採用されているかを見てください。

2.レベルは10進数で表されます。go/no-goの状況では、ブーリアンまたはフラグとして知られている別のタイプの表現を使用するのが一般的である。フラグを使えば、やりたいことができるのでしょうか?


あなたは言いました。

**正直なところ、あなたが意図的に書き残したことは思いつきません。取引に十分な資金があるかどうかをチェックするのであれば別ですが、それはまだ必要ありません。

今後のバージョンアップで必要になるかもしれませんね。


いいえ、十分な資金があるかどうかをチェックすることではありません。ロットサイズを指定する以外は資金管理をしない、と具体的におっしゃいましたね。もっと根本的なことです。

注文を出すために必要な情報はどのような項目ですか?これらの各項目は、psuedoコードのどこにどのように記述され、処理されるのでしょうか?


とおっしゃいました。

ここから先はどうするのか?この「ちゃんとした」コードを作っている間にも、私は上のコードの謎を解いています。これは古いパッチを当てたコードなので、私たちの疑似コードには従っていませんが、少なくとも1つの通貨については動作するはずなので、私はまだかなり困惑しています。重要なのは、このような無秩序な方法で構築することで、実際のコーディング要素(括弧がスクリプトにどのように影響するか、どこで変数を宣言するかなど)を学ぶことができることです。なぜそのコードが今のままではうまくいかないのか、何かアイデアはありませんか?


ご不満はお察しします。古いコードをざっと見ましたが、正直なところ、あなたがやろうとしていることは論理的にあまり意味をなしません。このコードを15分ほどで書き換えて、あなたが望むようにすることはできますが、それは問題ではありませんね。あなたはコードを書くことを学びたいと言いました。私は、あなた自身にそれを行う方法を指導するよう努力しています。


ニコ、あなたが(新しい)適切なコードを書き始めるのはそれほど遠くないと思いますが、まず「何をしたいのか」を正確に疑似コードに落とし込むことが重要です。

すぐにわかると思いますが、コーディングが「すっごく」楽になりますよ。


これからもよろしくお願いします。

乾杯

ティム

 

やあ、ティム。


いつもながら、お時間をいただき、本当にありがとうございます。あなたのコメントを反映させるために、疑似コードを修正するつもりです。実際のコードについては、心配しないで、きちんとやりましょう(私はちょっとせっかちなところがあるのですが : )。

 

やあ、Tim。


もう一度擬似コードを見て、私の初心者の脳が現時点で理解できる範囲でやってみました。コメントをお待ちしています。

ファイル:
 
niko wrote>>

やあ、Tim。

もう一度擬似コードを見て、私の初心者の脳が現時点で理解できる範囲でやってみました。コメントをお待ちしています。

ニック

いい感じですね。

私はあなたの最新の疑似コードに目を通し、いくつかの質問などに答えました。

コーディングを開始する準備はほぼ整ったと思います。


大雑把な目安としては、プログラミング時間の1/3は仕様作成、1/3はコーディング、1/3はデバッグとテストに使うべきと言われています。


ということは、この小さなプロジェクトも、だいたい1/3が終わったということになりますね。

では、MT4言語について説明します。


すべてのコンピュータ言語には、コンピュータが何をしようとしているのかを理解できるように、言語を記述するための特定の方法(フォーマット)があります。これと他の言語固有の情報は、ドキュメントで知ることができます。MT4のドキュメントは、このフォーラムからオンラインで入手できます。もしまだのようでしたら、ドキュメントで利用可能な情報の種類を見るために時間を費やすことをお勧めします。そうすれば、特定のトピックや機能についての情報が必要なときに、どこでそれを探せばよいかがわかるでしょう。


MT4を含む多くの現代的なコンピュータ言語では、生活を少し楽にするために、基本的なプログラムのレイアウトを設定するテンプレートを使用しています。これらのテンプレートプログラムは、しばしば「ウィザード」と呼ばれます。EAウィザードは、MetatEditorの「New」メニューの下に、緑色の十字がついた項目があります。


これを開くと、「Expert Advisor」のテンプレートがあります。これを選択すると、EA名、作者の詳細等とパラメータの入力を求められます。パラメータは後から追加・変更可能ですが、この段階では設定ブロックからパラメータを入力した方が良いでしょう。

各パラメーターには、名前、型、初期値を与える必要があります。


パラメータ名は、常にそれが何であるかを説明するものでなければなりません。


例えば、EURUSD_TopFilterLevelはex1 IS NOTのように意味のある名前です。意味のあるデータ名を使用することで、後でプログラムを理解したり、デバッグや修正することがより簡単になります。MT4では、データ名は大文字と小文字を区別することに注意してください。LOTSizeはLotSizeと同じではありません。データ名には注意と一貫性が必要です。


また、各パラメーターにデータ型(タイプ)を指定する必要があります。MT4では、Integer Number (int), Decimal Number (double), Text (string) and True / False or Flag (bool) の4つのデータ型のみを使用します。


繰り返しになりますが、データ型には注意が必要で、知らず知らずのうちに混在させると、微妙なバグが発生する可能性があります。


ウィザードでテンプレートを作成したら、プログラムの「構造化」を開始することをお勧めします。MT4における構造の基本単位は「関数」です。


最も単純な基本関数は、ここに書かれているように、実際には何も行いません。



void MyBasicFunction()

{

}


メタトレーダーウィザードが生成するテンプレートには、すでに3つの空の関数が含まれています。



int init()

{

return(0)

}



init deinit()

{

return(0)

}



int start()

{

return(0)

}


init 関数は、EAをチャート上にドラッグしてExpert advisorボタンをONにすると、EAが起動するたびに呼び出されます。

deinit 関数は、EAをチャートからドラッグしたり、Expert advisorボタンをOFFにしたりすると、EAが停止するたびに呼び出されます。


この関数は スタート 関数が呼び出されるのは、EAが接続されたチャートが新しいTICKを受信するたびにです。つまり、市場の混み具合によっては、1分間に数回以上呼ばれることもあります。私たちはここからほとんどの作業を行うことになります。


当面は、メインブロックのすべての疑似コードをstart関数に入れ、疑似コードを各行で//でコメントアウトすることをお勧めします。


次に、入力規則ブロックのために新しい関数を作成し、その中の擬似コードを同じようにコメントアウトしてください。


init関数とdeint関数は当面、空のままにしておきます。


このコードはエラーなしでコンパイルできるはずですが、もちろんこの段階では何もしません。


これからも頑張ってください。


よろしくお願いします。

ティム

(PS 必要であれば skype で話すことができますが、当面はフォーラムで様子を見ましょう)

ファイル:
 

やあ、ティム。

いつもながら、あなたのご協力とお時間は大変貴重です。感謝の気持ちを込めて、コーディングが終わったら、おいしいシャンパンを送りたいんだ。

そうそう、mqlの本は何度も読み返したけど、難しいのは理論を実践することだった。このサイトに掲載されているEAを10個ほどプリントアウトして、どのようにコーディングされ、どのように組み立てられているかを見て、理解しようとしました。そして、MT4のシミュレータトレーダーで多くの時間を費やしました(つまり、バックテストと 既存のEAの学習)。

私はコーディング作業を開始し、私たち双方が何が起こっているのかを理解できるように、ブロックを非常に明確かつ分割して作成します。そして、フォーラム経由であなたにそれらを送信します。

1 質問です。証券会社は攻撃的なピッピングを止めるためにいろいろなものを入れていると言いましたが、それは何ですか?1.攻撃的なピッピングの定義は何ですか?2.2.証券会社はどのようなものを導入しているのでしょうか?

私は以前、1分足でeurusdを手動でスキャルピングしていました(スプレッドベッティングの方法で)。この証券会社でこれをやる意味は全くありません。たとえ違法であっても、遅延は起こり、一日を台無しにします(通常1時間だけスキャルピングする場合、2回の遅延で貴重な時間を失うことになります)。私は、裁判を起こすという積極的な脅しの後、遅延したトレードのためにすべてのお金を取り戻しました。

2 質問です。あなたは別のブローカーを使用していますか?どのブローカーがお勧めですか?(あなたがここに名前を言及することが許可されている場合)。

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

ニック