新参者の冒険 - ページ 3

 
niko:

cloudbreakerさん、ありがとうございます。これは少し楽しくなってきました、私はあなたが戻り値の中で関数を呼び出すことができることを知りませんでした(それはおそらく他のすべての理論と同じように、mqlブックにあるにもかかわらず)。EC155のヘリコプターは格好いいですね。なぜ「ありがたい」かというと、自分のヘリはいらないから?

質問 エアロHC2です。


私は今のところ私の戦略のための3つのスクリプトを持っています。2つは単方向、1つは双方向です(ここで作業しているのはこの方です)。

MT4での経験から、画面上の5つほどのペアに異なるスクリプトを添付した場合(1ペアに1つのスクリプト)、深刻な問題が発生すると予想されますか。1つの大きなスクリプトをプログラムしたり変更したりして、そのスクリプトに好きなペアを選ばせるより簡単でしょう(そのためには毎日コードを変更する必要があるので)?

 
niko:

質問 エアロHC2です。


私は今のところ私の戦略のための3つのスクリプトを持っています。2つは単方向、1つは双方向です(ここで作業しているのはこの方です)。

MT4での経験から、画面上の5つほどのペアに異なるスクリプトを添付した場合(1ペアに1つのスクリプト)、深刻な問題が発生すると予想されますか。1つの大きなスクリプトをプログラムしたり変更したりして、そのスクリプトに好きなペアを選ばせるより簡単でしょうか(その場合、コードを毎日変更する必要があるため)。

ここで、通貨ペ アをまたいだ単一の取引戦略について話していると仮定します。

私は自分のEAをペアにとらわれないものにしたいのです - つまり、同じEX4がどのペアにも取り付けられるようにします。

-そうすれば、メンテナンスするコードベースは1つで済みます。

-ロジックは可能な限りシンプルなままです。

 
cloudbreaker:

ここで、通貨ペアをまたいだ単一の取引戦略について話していると仮定すると:-)

私は自分のEAをペアにとらわれないものにしたいのです。つまり、同じEX4をどのペアにも適用できます。

-そうすれば、コードベースは1つで済みます。

-ロジックはできるだけシンプルなままです。

そうですね、それが理想ですが、私はインジケーターベースではなく、毎日各通貨に手動でフィルターを設定していますし、アイデアは同じでも3つのストラテジーになってしまいます。そうすると、私の理解ではコードが大きくなってしまうし、すべてをまとめるとなると日々の調整も面倒になる。近い将来、フィルターをプログラムして作業時間を短縮するつもりですが、プログラムできないものは必ずあります(90%はプログラムするもので、残りは脳の仕事だと思います。でも、すべてをプログラムして完璧なモデルを作ろうとする前に、「聖杯」を追い求めたんだけどね、間違った方向を見ていたようだ。)


今週月曜日には、2つのストラテジーのコードが完成したので、本番運用を開始します。この2つの戦略は、義理の父と私自身によって少し手動で実行されましたが、コーディングすることでより高い結果をもたらすはずです。Combined戦略 については、同じチャート上に2つのEAを起動することができると思いますが(1つはロング、もう1つはショート)、私はまだ学びたいので、コーディング作業を再開する予定です。まだまだ勉強したいので、コーディング作業を再開します。


お住まいの国はどちらですか?私はイギリスのロンドンにいます。

 

こんにちは、cloudbreakerと他のMT4の達人です。


質問です。私は2つのスクリプトを持っています(1つは買い用、もう1つは空売り用)。今日、3つのペアで両方を使いたいと思いました。さて、1つのチャートに添付できるEAは1つだけなので、6つのチャートを開き(1ペアに2つ)、スクリプトを添付しました。しかし、実行されたスクリプトは1つだけでした。なぜなのかさっぱりわかりません。どなたか教えてください。


要約すると、2つのEA、1つは買いだけ、もう1つは空売りだけ、非常に基本的なルール(emasのゴールデンクロス、それだけ)、利益確定20ピップ、ストップロス なし、です。なぜ1つしか実行されないのでしょうか?Expert Advisors が有効であることを確認し、すべてのスクリプトの横にあるチャートに笑顔がありました。

 
niko:

こんにちは、cloudbreakerと他のMT4の達人です。


質問です。私は2つのスクリプトを持っています(1つは買い用、もう1つは空売り用)。今日、3つのペアで両方を使いたいと思いました。さて、1つのチャートに添付できるEAは1つだけなので、6つのチャートを開き(1ペアに2つ)、スクリプトを添付しました。しかし、実行されたスクリプトは1つだけでした。なぜなのかさっぱりわかりません。どなたか教えてください。


要約すると、2つのEA、1つは買いだけ、もう1つは空売りだけ、非常に基本的なルール(emasのゴールデンクロス、それだけ)、利益確定20ピップ、ストップロスなし、です。なぜ1つしか実行されないのでしょうか?Expert Advisors が有効であることを確認し、すべてのスクリプトがチャートの横に笑顔で表示されました。



ログファイルには何が書かれていますか。

Trade Context Busy "のメッセージは出ていますか?もしそうなら、IsTradeAllowed()関数を 使用したロジックを追加することをお勧めします。

そうでない場合は、EAにPrint()ステートメントを散りばめることをお勧めします。

 
cloudbreaker wrote>>

logsディレクトリとexpertsディレクトリにあるログファイルの内容は?

Trade Context Busy」メッセージは出ていますか?もしそうなら、IsTradeAllowed()関数を使用したロジックを追加することをお勧めします。

そうでない場合は、EAにPrint()ステートメントを散在させることをお勧めします。

雲雀さん、救出ありがとうございます。

1.ログディレクトリってどういう意味ですか?2.どうやったら両方に行けるのでしょうか?(C>ProgramFiles>MT4>Experts>Logsで開こうとしたのですが、フォルダが空っぽのままです)。

 
niko wrote>>

hey cloudbreakerさん!レスキューに来てくれてありがとうございます。

1.ログディレクトリってどういう意味ですか?その両方にアクセスするにはどうしたらいいのでしょうか?(C>ProgramFiles>MT4>Experts>Logsで開こうとしましたが、フォルダが空のまま表示されます)。

こんにちは、cloudbreaker!

私はすでにコーディングに関するあなたのコメントに何度も目を通し(私の壁にすべて貼ってあります)、理解しようとし、それをすべてつなぎ合わせましたが、まだ完全に迷っています。他のEAからMyOrderCount関数をコピーすることはできましたが、それをどのようにコードに統合するかはまだ考えていません。私は完全に手も足も出ない状態ですが、進歩がないわけではありません。もしあなたが、私がコードを少しずつ構築するのを助けてくれるなら(そして、私が自分で構築できる、より具体的なものを指示してくれるなら)、私たちはコードを完成させ、私はより速く学ぶことができるでしょう。

私ができる限りのコードと、私が考える「プログラム設計の地図」を添付しました。メモ帳++でダブルチェックしながら進めていくので、コードの中の括弧のような細かいことは気にしないでください。

優先順位としては、MyOrderCountのコードを残りのコードに統合するのをステップバイステップで手伝ってくれるなら、そして私たちが進むにつれてすべてを少しずつ説明することをお願いします。また、あなたが適切だと思うのであれば、本の特定の部分やそのようなものを私に送ることもできます。そうすれば、もっと早く進歩できます。

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

ps: プログラムマップが添付されなかったら教えてください。

//+------------------------------------------------------------------+
//|                                     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);
     }
  //-------------------Declaring All Variables and Conditions

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;
//--------------------declaration end

//-------------order counting code
int CalculateNumberOfOrders(string Symbol)
{
int long=0,short=0;
for(int i=0;i<OrdersTotal();i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
      if(OrderType()==OP_BUY)long++;
      if(OrderType()==OP_SELL)sell++;
     {
  //---return orders Volume
  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.


//------------------EURUSD Block-------------------------
//check order type, if it doesn't equal to buy already then buy
if(OrderType()
     {
    static int ticket;
      // deleted if(OrdersTotal()==0)
     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());
              }
              //return(0);
       }

      //  -------------------------------------------------------------------------------------------

      {
      static int ticket1;
            // deleted if(OrdersTotal()==0)
        if(e1over2 && e2over3) //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);   //the problem is with this return not being
in the right place i think
        }
      }
return(0);
}
}

ps: コード中のランダムな // コメントは無視してください。

 
niko wrote>>

やあ、cloudbreaker!

私はあなたのコーディングに関するコメントを何度も読み返し(私のウォールにも全て貼ってあります)、理解し、それをまとめようとしましたが、まだ完全に迷っています。他のEAからMyOrderCount関数をコピーすることはできましたが、それをどのようにコードに統合するかはまだ考えていません。私は完全に手も足も出ない状態ですが、進歩がないわけではありません。もしあなたが、私がコードを少しずつ構築するのを助けてくれるなら(そして、私が自分で構築できる、より具体的なものを指示してくれるなら)、私たちはコードを完成させ、私はより速く学ぶことができるでしょう。

私ができる限りのコードと、私が考える「プログラム設計の地図」を添付しました。メモ帳++でダブルチェックしながら進めていくので、コードの中の括弧のような細かいことは気にしないでください。

優先順位としては、MyOrderCountのコードを残りのコードに統合するのをステップバイステップで手伝ってくれるなら、そして私たちが進むにつれて、すべてを少しずつ説明してください。また、あなたが適切だと思うのであれば、本の特定の部分やそのようなものを私に送ることもできます。そうすれば、もっと早く進歩できます。

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

ps: プログラムマップが添付されなかったら教えてください。

ps: コード中のランダムな // コメントは無視してください。

こんにちは、Nikoさん。

この議論に私の2ペンス分の価値を加えてもよろしいでしょうか。

古い、事実上骨董品 :) のようなプログラマーとして、また少しばかり教育やトレーニングの経験もあるので、私はこれまでかなり多くの悪いコードに出くわしてきました。下手なコードにつながるよくある間違いは、計画性の欠如です。当たり前のことかもしれませんが、コードを書く前に、何をしたいのかを明確にする必要があります。これは余分な作業のように思えるかもしれませんが、長期的には時間を大幅に節約し、より信頼性が高く、より理解しやすく、より簡単にメンテナンスできるコードを作成することができます。

コンピュータのコードを指定するのに非常に便利なテクニックの1つが、疑似コーディングと呼ばれるものです。基本的には、コンピュータの命令のような論理的なセットを平文で書いたものです。特定の書式は必要ありませんが、あらゆるコンピュータ・プログラミング言語に何らかの形で見られる典型的なコンピュータ・プログラムの専門用語を使用することができます。

ここでは、チーズとマカロニを調理するための疑似コードの例を示します。IBFXのサイトにある「Intro to Programming by Patrick Nouvion」という記事から持ってきました。記事全体は一読の価値があると思います。http://www.ibfx.com/ibfxu/catalog/programming/pro1010.aspx。

開始
ミルクとバターとクラフトの箱を探す
見つかれば継続
見つからなければ、子供を買い物に行かせる

食器棚の中にある鍋を探す

見つかればそのまま、見つからなければ妻に探すのを手伝ってもらう。

ストーブを探す
見つかればそのまま
さもないとピザを注文する

空いているバーナーを探す
あれば続ける
さもなくば使用可能にする

ストーブを強にする
水を探す
見つかれば続ける
else ピザを注文する

鍋に水を入れる
ストーブが熱くなっていることを確認する
熱かったら続ける
さもなければ、プラグが接続されているかどうか確認する
さもなければ、修理業者を呼び、ピザを注文する

鍋をバーナーの上に置く
もし塩があれば、塩をひとつまみ加える。
なければそのまま
もし、コショウがあれば、コショウをひとつまみ加える。
なければそのまま
お湯が沸騰しないうちに
クラフトの箱を開ける。
箱からマカロニを取り出し、鍋に入れる。
8分待つ
待っている間、鍋が沸騰しすぎたら火を弱め、息を吹きかける。
ザルを探す。
マカロニをざるにあげる。
鍋に戻す
チーズのパックの中身を入れる。
バターを加える。
牛乳(大さじ1)を加える。
混ぜ合わせる。
濃すぎる場合は、牛乳大さじ1を加え、濃くない場合は、食べる。
終了

もし私がこの疑似コードを自分で書いていたら、機能ブロックに分割し、インデントを少し使って「きれいに見える」ようにすることで、もう少し洗練させるでしょう。例えば

START BLOCK - 沸騰したお湯を用意する

鍋に水を入れる

鍋をバーナーの上に置く
塩があれば、塩をひとつまみ入れる。
ない場合はそのまま
コショウがあれば、コショウをひとつまみ入れる。
なければそのまま
お湯が沸騰しないうちに

ENDブロック -沸騰したお湯を用意する

といった具合に......。

ニコ、自分でコードを書けるようになりたいと思う気持ちは賞賛に値するわ。私の経験では、一番手っ取り早く簡単に学べる方法は、今やっていることをそのままやってみることです。しかし、私が提案したいのは、一歩下がって、何を達成したいのかを疑似コードで書き出してみることです。そうすることで、自分が何を実現しようとしているのか、考えが明確になるはずです。

それができたら、私や他の人に見てもらうために、ここに投稿してみてください。疑似コードができたら、それをMT4コードに変換することができます。一度に全部やろうとすると、特に初心者の場合、ジャンプが大きすぎます。

ちなみに、私の擬似コードは決して無駄にはなりません。そのほとんどは、完成したコードのコメントとして仕上がります。

グッドラック

ティム・ウィルソン

 
niko:

やあ、cloudbreaker!

私はあなたのコーディングに関するコメントを何度も読み返し(私のウォールにも全て貼ってあります)、理解し、それをまとめようとしましたが、まだ完全に迷っています。他のEAからMyOrderCount関数をコピーすることはできましたが、それをどのようにコードに統合するかはまだ考えていません。私は完全に手も足も出ない状態ですが、進歩がないわけではありません。もしあなたが、私がコードを少しずつ構築するのを助けてくれるなら(そして、私が自分で構築できる、より具体的なものを指示してくれるなら)、私たちはコードを完成させ、私はより速く学ぶことができるでしょう。

私ができる限りのコードと、私が考える「プログラム設計の地図」を添付しました。メモ帳++でダブルチェックしながら進めていくので、コードの中の括弧のような細かいことは気にしないでください。

優先順位としては、MyOrderCountのコードを残りのコードに統合するのをステップバイステップで手伝ってくれるなら、そして私たちが進むにつれてすべてを少しずつ説明することをお願いします。また、あなたが適切だと思うのであれば、本の特定の部分やそのようなものを私に送ることもできます。そうすれば、もっと早く進歩できます。

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

ps: プログラムマップが添付されなかったら教えてください。

ps: コード内のランダムな // コメントは無視してください。

ざっと見たところ、あなたは根本的な間違いを犯しているようです。

あなたはstart()関数のコードブロックの中でMyOrderCount()関数を宣言しようとしているようです。

あなたのコードは、init(), start(), yourfunction1(), yourfunction2() ... yourfunctionN() という一連の関数だと考えてみてください。

init()関数とstart()関数は、特殊な関数です。init()関数は、EAを最初に初期化するときに一度だけ実行されます。start()関数は、ティックが到着するたびに実行されます。

つまり、start()関数は、EAが起動した後にすべてのロジックが呼び出されるルートになります。

例えば、ティックが到着するたびに、start()関数が実行され、次のようなことを行います。

- いくつかの条件をチェックする

- 条件を満たした場合、注文を実行する

条件の1つは、買い注文を する前に、すでにそのタイプの注文(例えば買い)がないことを確認することです。

そこで、start()関数の中で、買い注文カウント関数(start()関数の外側にあるコードブロック)にCALLすることによって、どのような買い注文が存在するかを調べる必要があります。

注文カウント関数が買い注文の数を返すので、買い注文カウント関数を呼び出した後の行で start() 関数の実行を再開します。

そして、買い注文カウント関数から返された値を使用して、買い注文を実行するかどうかを決定します。

実際の買い注文の実行は、自分で作成した別の関数(ここでも start() 関数の外部で宣言されています)を呼び出すことになるかもしれません。

これでお分かりいただけたでしょうか。しかし、私はただ、関数と呼び出しの概念について、あなたの頭を理解させようとしているだけなのです。


CB

 

やあ、TSWilsonとCB!

あなたたちは素晴らしい!本当にありがとうございます。

疑似コードについては、全くその通りです。私はpro**realtime言語で非常に基本的なプログラミングをしたときにこれをしましたが、そこでは宣言もブロックもなく、とてもシンプルでした(コード全体が「if...then」だけでした)。今朝、疑似コードを書き始め(これを書くために1時間早く出勤しました)、どのように、どのようなブロックを持つべきかという視覚的な図を書きました。今日中にこれを完成させ、ここに掲載する予定です。

これが完成したら、残りのブロックやコードの詳細については、皆さんの助けを借りて考えたいと思います。というわけで、とりあえず図面に戻ることにします。

私は来週休暇を取るので、行く前にすべてを準備したいので、今日と明日の夜通しでコードを完成させることができます。

というわけで、今日もこのスレッドを見ていてください。

そして、いつものように、あなたのような人たちに宇宙から感謝します。