ロジックに関するヘルプ
ページ 1 - 323 123 最終最終
Results 1 to 10 of 21

Thread: ロジックに関するヘルプ

  1. #1
    こんにちは、みんな、

    私は、Little Big Man EAを構築する過程をほぼ終えていますが、論理の点で行き詰まっています。

    あなたが見ることができるように私は私のコードを以下に添付しました、そしてこれはすべてMartingale()関数の中にあります。

    このEAの全体的なポイントは、小さな賞金を獲得することです。小さな賞金が動けなくなると(ストラグラー)、それからエントリー価格から200ピップス(または「X」)下がって、それらの中からマーチンゲールします。

    デフォルトでは200ピップスごとにロジックが設定されていて、トレードはクローズされ、その後新しいトレードがその場所で1.5倍になります。

    それで、私はその失われた貿易のためにBEにテイク利益を計算しました。しかしながら:

    1)最初のレベルで20.00を失っても15.50しか戻ってこないので、計算は正しく機能していません。

    それが複数のレベルになる場合、私は取得することができません。 L2は200ピップで入力され、0.02ロットとなり、L3は400ピップと入力され、0.03ロットとなります。L4は600ピップで入力され、0.05ロットとなります。

    誰かがこれを行う方法を教えてください。ありがとう。

    これが私がこれまでに持っているものの短いバージョンです:

    NewMultiplierTakeProfit =((OrderOpenPrice()* OrderLots()) (Ask * NewLotSize))/((OrderLots() NewLotSize));/新しいテイクプロフィットを計算する

    Inserted Code/ ------------------------------------------------------------------ /| REAV_EA.mq4 | /| Copyright © 2010, Kenny Hubbard | /| http://www.compu-forex.com | / ------------------------------------------------------------------ #property copyright Copyright © 2010, Kenny Hubbard #property link http://www.compu-forex.com #define NO_RESULT -10 extern int MagicNumber = 100; extern double Eq_StopLoss = 10000; extern double Risk = 0.01; extern double Trail_From = 8; extern double Trail_Max = 50.0; extern double Trail_Percent = 20; extern double Grid_Size = 13; extern int MinimumReEntry = 200; extern double Multiplier = 1.5; extern int MinimumProfit = 1; int D_Factor = 1, LotDigits = 1, Slippage = 3, Retries = 10; double Anchor, Pip, Grid_Min = 0, Grid_Max = 0, Grid_Ord_OpenPrice#91;#93;#91;2#93;, Auto_Grid, NewMultiplierTakeProfit = 0, NewLotSize = 0; string Order_Cmt = Little Big Man EA; / ------------------------------------------------------------------ /| expert initialization function | / ------------------------------------------------------------------ int init() { Pip = Point; /---- if (Digits == 3|| Digits == 5){D_Factor = 10; Pip *= 10;} Grid_Size *= Pip; if (MarketInfo(Symbol(),MODE_LOTSTEP) == 0.01)LotDigits = 2; Auto_Grid = Grid_Size; if(MinimumProfit == 0){MinimumProfit = 1;} /---- return(0); } / ------------------------------------------------------------------ /| expert deinitialization function | / ------------------------------------------------------------------ int deinit() { /---- /---- return(0); } / ------------------------------------------------------------------ /| expert start function | / ------------------------------------------------------------------ int start() { int result = NO_RESULT; /---- if (!OrdersTotal()){ Print(Making an initial trade); OrderSend(Symbol(), 4, Get_Lots(Risk), NormalizeDouble(Ask Auto_Grid,Digits), Slippage, 0 ,0 ,Order_Cmt, MagicNumber, 0, Blue); OrderSend(Symbol(), 5, Get_Lots(Risk), NormalizeDouble(Bid-Auto_Grid,Digits), Slippage, 0 ,0 ,Order_Cmt, MagicNumber, 0, Blue); } Update_Grid(Grid_Min, Grid_Max); result = Check_For_Trade(Grid_Min, Grid_Max); if(result!=NO_RESULT)Do_Trade(result); Trail_Stop(); Martingale(); double BuyLevel = (Bid - (MinimumReEntry * Pip)); double SellLevel = (Ask (MinimumReEntry * Pip)); Comment(Buy Level: , (BuyLevel), \n, Sell Level: , (SellLevel), \n, Bid :, Bid, \n, Ask :, Ask, \n, Minium Reentry: , MinimumReEntry, \n /Point: , NormalizeDouble(MinimumReEntry*Point,10),\n, /Pip: , NormalizeDouble(MinimumReEntry*Pip,10) ); /---- return(0); } / ------------------------------------------------------------------ void Martingale()/Function to remove existing straggler orders { for(int xo = 0; xo lt; OrdersTotal(); xo ) { if(OrderSelect(xo,SELECT_BY_POS)) { RefreshRates(); if(OrderType() == 0) { if(OrderOpenPrice() gt;= (Bid (MinimumReEntry * Pip))) { NewLotSize = Multiplier * OrderLots(); NewMultiplierTakeProfit = ((OrderOpenPrice() * OrderLots()) (Ask * NewLotSize))((OrderLots() NewLotSize));//Calculate new take profit if(OrderClose(OrderTicket(),OrderLots(),Ask,99,Red)) { OrderSend(Symbol(), 0, NormalizeDouble(NewLotSize,LotDigits), Ask, Slippage, 0 , NormalizeDouble((NewMultiplierTakeProfit (MinimumProfit*Pip)),10) , Multiplied Order, MagicNumber, 0, Blue); } } } if(OrderType() == 1) { if(OrderOpenPrice() lt;= (Ask - (MinimumReEntry * Pip))) { NewLotSize = Multiplier * OrderLots(); NewMultiplierTakeProfit = ((OrderOpenPrice() * OrderLots()) (Bid * NewLotSize))(OrderLots() NewLotSize);//Calculate new take profit if(OrderClose(OrderTicket(),OrderLots(),Ask,99,Red)) { OrderSend(Symbol(), 1, NormalizeDouble(NewLotSize,LotDigits), Bid, Slippage, 0 , NormalizeDouble((NewMultiplierTakeProfit-(MinimumProfit*Pip)),10) , Multiplied Order, MagicNumber, 0, Blue); } } } } } } / ------------------------------------------------------------------ void Update_Grid(double Min, double Max) { int Order_Cnt=0, Grid_Num = 0; for(int i=0;ilt;OrdersTotal();i ){ if(OrderSelect(i,SELECT_BY_POS)){ if(OrderType()gt;3)Order_Cnt ; } else Print(Error Selecting Order = GetLastError()); } ArrayResize(Grid_Ord_OpenPrice,Order_Cnt); ArrayInitialize(Grid_Ord_OpenPrice,0.0); for(i=0;ilt;OrdersTotal();i ){ if(OrderSelect(i,SELECT_BY_POS)){ if(OrderType()gt;3){ Grid_Ord_OpenPrice#91;Grid_Num#93;#91;0#93; = OrderOpenPrice(); Grid_Num ; } } else Print(Error Selecting Order = GetLastError()); } ArraySort(Grid_Ord_OpenPrice); Min = Grid_Ord_OpenPrice#91;0#93;#91;0#93;; Max = Grid_Ord_OpenPrice#91;Order_Cnt-1#93;#91;0#93;; } / ------------------------------------------------------------------ int Check_For_Trade(double Min, double Max) { if(Ask gt;= Max Auto_Grid)return(OP_BUYSTOP); if(Bid lt;= Min - Auto_Grid) return(OP_SELLSTOP); return(NO_RESULT); } / ------------------------------------------------------------------ void Do_Trade(int Buy_or_Sell) { switch(Buy_or_Sell){ case OP_BUYSTOP: int ticket = OrderSend(Symbol(),OP_BUYSTOP,NormalizeDouble(Get_Lots(Risk),LotDigits),NormalizeDouble(Ask Auto_Grid,Digits), Slippage,0,0,Order_Cmt,MagicNumber,0,Green); Delete_Opposite_Trade(5); ticket = OrderSend(Symbol(),OP_SELLSTOP,NormalizeDouble(Get_Lots(Risk),LotDigits),NormalizeDouble(Bid - 2 * Auto_Grid,Digits), Slippage,0,0,Order_Cmt,MagicNumber,0,Red); break; case OP_SELLSTOP: ticket = OrderSend(Symbol(),OP_SELLSTOP,NormalizeDouble(Get_Lots(Risk),LotDigits),NormalizeDouble(Bid - Auto_Grid,Digits), Slippage,0,0,Order_Cmt,MagicNumber,0,Red); Delete_Opposite_Trade(4); ticket = OrderSend(Symbol(),OP_BUYSTOP,NormalizeDouble(Get_Lots(Risk),LotDigits),NormalizeDouble(Ask 2 * Auto_Grid,Digits), Slippage,0,0,Order_Cmt,MagicNumber,0,Green); break; default : Alert(Unknown ordertype returned); break; } return; } / ------------------------------------------------------------------ void Delete_Opposite_Trade(int Del_B_S) { for(int i=0;ilt;OrdersTotal();i ){ OrderSelect(i,SELECT_BY_POS); if(OrderMagicNumber() == MagicNumber){ if(OrderType() == Del_B_S)OrderDelete(OrderTicket()); } } } / ------------------------------------------------------------------ double Get_Lots(double lRisk) { double Lots = AccountEquity() * lRisk/100/1000; if (MarketInfo(Symbol(),MODE_MINLOT) gt; Lots)Lots = MarketInfo(Symbol(),MODE_MINLOT); if (MarketInfo(Symbol(),MODE_MAXLOT) lt; Lots)Lots = MarketInfo(Symbol(),MODE_MAXLOT); return(Lots); } / ------------------------------------------------------------------ bool Trail_Stop() { bool mod, lresult = false; double My_Profit, My_Trail, My_SL, lTrail_Max, lTrail_From, Stop_Level; /---- for (int i = 0; i lt; OrdersTotal(); i ){ if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderMagicNumber() == MagicNumber) { RefreshRates(); /****************************** HARDCODED FOR NOW UNTIL BETTER SOLUTION, TO .01 LOTS, FOR UNDER 10K ACCOUNT IT WORKS!************************* if(OrderLots() lt; 0.02) { lTrail_Max = Trail_Max * Pip; lTrail_From = Trail_From * Pip; Stop_Level = MarketInfo(OrderSymbol(),MODE_STOPLEVEL)*Pip; switch(OrderType()){ case OP_BUY : My_Profit = Bid - OrderOpenPrice(); My_Trail = MathMin(My_Profit * Trail_Percent/100,lTrail_Max); My_SL = NormalizeDouble(OrderClosePrice()-My_Trail,Digits); lresult = true; if(My_Profit gt; lTrail_From){ if(OrderClosePrice() - My_SL gt; Stop_Level){ if(OrderStopLoss() lt; My_SL||OrderStopLoss() == 0)mod = OrderModify(OrderTicket(),OrderOpenPrice(),My_SL,OrderTakeProfit(),0, CLR_NONE); } } break; case OP_SELL : My_Profit = OrderOpenPrice() - Ask; My_Trail = MathMin(My_Profit * Trail_Percent/100,lTrail_Max); My_SL = NormalizeDouble(Ask My_Trail,Digits); lresult = true; if(My_Profit gt; lTrail_From){ if(My_SL - OrderClosePrice() gt; Stop_Level){ if(My_SL lt; OrderStopLoss()||OrderStopLoss() == 0)mod = OrderModify(OrderTicket(),OrderOpenPrice(),My_SL,OrderTakeProfit(),0,CLR_NONE); } } break; } if(!mod GetLastError() gt; 1)Print(Error entering Trailing Stop - Error GetLastError()); } } } else Print(Error selecting order); } /---- return(lresult); }

  2. #2
    Quote Originally Posted by ;
    こんにちはギル、これが役立つかどうかわからないがそれを試してみてください。あなたが知っているかもしれないポイントのいくつか: - これは道の途中であなたの人生に混乱を引き起こすので、注文の数を変えることを含むループの中で直接OrdersTotal()を使うことに注意してください。それはバグを見つけるのが非常に困難な場合があります。これの理由はあなたがから数えるループがあるかどうかです...
    ケニー、どうもありがとう。何百万回も。はい、私の論理はあなたのものと似ていると思いましたが、まったく正しくありませんでした。私はあなたがそれを綴るだけでそれが理にかなっているかと思います、しかしそれをコードに入れることはいつも時々そんなに簡単に見えません。
    私はあなたが総注文などについてあなたが言うことを理解します。意味があります。私がANYTHINGをプログラムしてから10年が経ったので、クモの巣はゆっくり消えていきます!
    私はあなたなしではこれができませんでした!私はこれに頭を近づけてそれを直視させてください。アロハ! P.Sあなたがそれについてどのように取り組むかに時間があるなら、私はあなたのためのもう一つの質問があるかもしれません?私はいくつかの方法を考え出しました、しかし私がそれを正しくしているかどうかわからない。 15ピップ以内の既存の注文をチェックしてから15ピップス離れてグリッドを移動するように、基本ロジックでグリッドをどのように設定しますか。私は自分自身のコードを作成し、あなたが何を考えているかを見るでしょう、しかしあなたがそれをした方法私は何よりももっと問題を起こすであろうという気持ちを持っています、しかしそれをやろう!害はない、ファウルもない!

  3. #3

    Quote Originally Posted by ;
    P.Sあなたがそれについてどのように取り組むかに時間があるなら、私はあなたのためのもう一つの質問があるかもしれません?私はいくつかの方法を考え出しました、しかし私がそれを正しくしているかどうかわからない。 15ピップ以内の既存の注文をチェックしてから15ピップス離れてグリッドを移動するように、基本ロジックでグリッドをどのように設定しますか。
    こんにちはギル、私はあなたがこれらのことをする正しい方法がないことを発見すると確信しています....あなたが思い付いた方法のうちの1つがあなたがそれと共に走らなければならない仕事。後でいつでもルーチンを見直すことができますし、多くの場合改善する方法がありますが、私の最初のルールは常にうまくいくことを行うことです。とにかく、私は個人的にOrderOpenPricesを配列にロードして、順番に現在の価格と比較しながら順番にそれぞれを調べます。このアプローチの理由の1つは、Update_Grid関数をチェックすると、順序が既に配列にロードされているため、そのルーチンを単純に展開することです。私はあなたが今テイクプロフィットで何をしているかわかります......私は単に最後の取引からの損失だけを見ていました。あなたの方法ははるかに順守されています。手元にある式について考えることはできません.....私はこれについて考えて行かなければならないでしょう。単純にしたい場合は、Stragglersからの損失を合計して、現在の回復量に基づいてそれをピップ数TPに変換する変数を使用します。主な問題は、$$の損失が最新のlotizeに基づいていることを知ることです。進行を保存するか、計算する必要があります。 15個のロットが1 2 4 8に分割されていることは簡単にわかりますが、それを計算するための別のことです。
    Quote Originally Posted by ;
    init()セクションに次のコードを入力します。MinimumReEntry * = Pip; MinimumProfit * = Pip;
    あなたはこれらを整数として宣言したので、それをdoubleに変更します。問題を解決するかもしれませんが、明らかなバグから始めましょう。
    Quote Originally Posted by ;
    私はあなたが総注文などについてあなたが言うことを理解します。意味があります。
    死んだ馬を鞭で打つ危険性があるので、私は自分の誤りを指摘する必要があります。 ordersループでカウントダウンする方法では、OrdersTotal()を使用しても問題ありません。ループの先頭で値を代入し、条件として使用しないからです。 0からカウントアップする場合は、ordercountを静的に保つために中間変数を割り当てる必要があります。私はこれが彼らが常にあなたの注文ループをカウントアップするよりカウントダウンするのが良い習慣であると言う理由であると思います。これを念頭に置いて、Total_Orders変数を削除すると、時間とメモリが無駄になります。私が作成したもう1つのバグ(この説明には関係ありません)....... Grid_MinおよびGrid_Max変数は、グローバルセクションではなくStart()関数で宣言する必要があります。

  4. #4
    Quote Originally Posted by ;
    私はこれについて考えなければならないでしょう。単純にしたい場合は、Stragglersからの損失を合計して、現在の回復量に基づいてそれをピップ数TPに変換する変数を使用します。主な問題は、$$の損失が最新のlotizeに基づいていることを知ることです。進行を保存するか、計算する必要があります。 15個のロットが1 2 4 8に分割されていることは簡単にわかりますが、それを計算するための別のことです。
    ケニー、これはおそらく私の数学の頭の上です。 Void CalculatePreviousLosses(NewLotSize){NewLotSizeMultiplierをStartingLotSize(Get_Lots関数)に達するまでループダウンします。ループするたびにカウントし、それぞれの値にMinimumReEntryを掛けて合計の損失を計算します変数は、その時:Return(TotalNumberOfPipsLost);私はそれを試してみるつもりですが、私のプログラミングが正しいかどうかはわかりません。
    Quote Originally Posted by ;
    とにかく、私は個人的にOrderOpenPricesを配列にロードして、順番に現在の価格と比較しながら順番にそれぞれを調べます。このアプローチの理由の1つは、Update_Grid関数をチェックすると、順序が既に配列にロードされているため、そのルーチンを単純に展開することです。
    はい、それは私が同様に考え出した方法です。私はこの言語で配列を扱うことに慣れていないので、試行錯誤しなければならないでしょう。楽しいはずです。

  5. #5
    ギル、うん、それはあなたが正しい方向に進んでいるように見えます。最初にMS Excelのようなもので式を正しく作成する方が簡単なことがあります。正しい式ができれば、実装は簡単です。配列についてあまり汗をかきたくないでしょう。大部分のものはすでに存在しています.....配列の読み方を理解する必要があります。ああ、そしてもう1つ..... ..... OrdersTotal()ループが再び...... OrdersTotal()-1から開始する必要があります。私は昨夜ただバカをしただけだった。質問があれば叫んでください。

  6. #6
    こんにちはギル、よさそうだ。あなたはこれにコツがあるようです。どこかにちょっとしたエラーがあるかもしれません……CalculatePreviousLossesルーチンを見て、印刷のためにPrintコマンドを使って変数をExpertsタブに書いて検査することをお勧めします。そうすることで自分たちの価値観を自分で見て、コンピュータが何を見ているのかを知ることができます。コードが100%正確であり、不一致がスワップとコミッションで発生する可能性もありますが、これにはあなたの不一致が少し大きいように思われます。

  7. #7
    Quote Originally Posted by ;
    こんにちはギル、よさそうだ。あなたはこれにコツがあるようです。どこかにちょっとしたエラーがあるかもしれません……CalculatePreviousLossesルーチンを見て、印刷のためにPrintコマンドを使って変数をExpertsタブに書いて検査することをお勧めします。そうすることで自分たちの価値観を自分で見て、コンピュータが何を見ているのかを知ることができます。コードが100%正確であり、不一致がスワップとコミッションで発生する可能性もありますが、これにはあなたの不一致が少し大きいように思われます。
    うーん...わかりません...でも、時間をかけています。
    ありがとう。私は印刷をするでしょう、そして見る、それもまだそれをしていません。私を導いてくれてありがとう。私はそれらがより小さな繰り返しで正確であると思います、しかしそれがレベル4以上を言うようになるとき、それは少し比例から外れ始めます、しかしそれは多分スワップかもしれません....私は「近い」私は近いです。

  8. #8
    ケニー、あなたがマーチンゲールを使って資金管理ルーチンの論理を回避する方法について多分私を導くのにも親切になれたらと思います。例えば、MMルーチンはそれを持っているのでそれはより多くの公平性(それは素晴らしいです)と共に増加します、しかしそれからそれはポジションの多くを描き過ぎるでしょう、それで私はそれに0を加えました。私が欲しいものともっとインラインです。しかし、私がトレーリングストップを設定するとき、私はあなたのコードをハードコードして、.02ロット以下ならトレイルをするかどうかを言うようにしました。しかし、それでMMが上手く機能するわけではありません…?だから...私の考えは、あなたが思う最高の方向に私を指してください。 - 注文にコメントフィルタを追加してから、そのフィルタでTSをフィルタします。私は実際に既にこのMultiplied Orderコメントをmartingaled注文に対して持っています、それで私はそれを単にフィルターにかけることができます、しかしそれが良いコーディング習慣であるかどうか確かではないですか? - 開始ロットサイズを識別するgetLotsルーチンでエクスポートされるロジックをいくつか入れます。しかし、マーチンゲールやエクイティが20Kに達する古い.02ロットがあり、今や開始ロットが.02であるとすると、混乱が生じるでしょう。どうもありがとうございます、私はあなたの時間の多くを占めていないことを願っています。

  9. #9

    Quote Originally Posted by ;
    しかし、マーチンゲール用の古い.02ロットがあり、エクイティが20Kに達すると、開始ロットは.02になり、混乱が生じるでしょう。
    このような問題を予測することができるということが、私がコツと言っていることです。良い場所です。私はそれを汗と思っていませんでした......あなたが完璧さと実用性の間で選択しなければならない時が来ます。この場合、最悪の場合は、小さな利益ではなく小さな損失で終了するサイクルです。配列は10年で変わっていないので、行ってもいいはずです。ちょっと一言、現在のシステムは始値のみを格納しているので、チケット番号に別の要素を追加する必要があります。 2つの方法があります.....どちらかのように新しい一次元配列を宣言するか: - int Grid_Ord_Ticket []または既存の配列を拡張することができます。つまり、既存のGrid_Ord_OpenPrice [] [2]の2番目のレベルを使用することができます。以前の経験から、10%のコーディングと90%のデバッグに費やすことがわかるでしょう。あなたを助けるためのデバッガがないので、MQL4はこの点であなたの最悪の悪夢です。 MQL4はあなたが間違ったことをすることをしばしば許しますがあなたに告げません......良い例はあなたが整数としてそれらのdoubleを宣言したときでした。優れたランタイム環境/デバッガは、浮動小数点数を整数変数に代入しようとしていることを示しています..... MQL4ではなく、単に数値を四捨五入して続行するため、予測不可能な出力が生じます。最良のツールは、変数を調べるために、時には単にプログラムマーカーとして使用するために使用するPrintコマンドです。そのため、関数が実行されていることがわかります。 Comment()を使用してからビジュアルバックテストを実行することもできますが、Printのほうが簡単だと思います。 Printは実行速度に(スクリーン出力と共に)影響を与える唯一の最大の項目なので、それらを削除することを忘れないでください。

  10. #10
    Quote Originally Posted by ;
    このような問題を予測することができるということが、私がコツと言っていることです。良い場所です。私はそれを汗と思っていませんでした......あなたが完璧さと実用性の間で選択しなければならない時が来ます。この場合、最悪の場合は、小さな利益ではなく小さな損失で終了するサイクルです。配列は10年で変わっていないので、行ってもいいはずです。ちょっと一言、現在のシステムは始値のみを格納しているので、チケット番号に別の要素を追加する必要があります。 2つの方法があります.....どちらも新しい単一次元配列を宣言する...
    私たちがハワイ(私が住んでいた場所)で言うように、あなたはダ・キネ・ブラ!
    それをやってみよう!

投稿権限

  • Youma新しいスレッドを投稿しない
  • Youmaは返信しない
  • あなたは添付ファイルを投稿しないかもしれない
  • Youma Notedityourposts
  •  
  • スマイリーはオンです
  • スマイリーはオンです
  • [IMG]コードがオンです
  • [VIDEO]コードがオンです
  • HTMLコードがオフです
This website uses cookies
We use cookies to store session information to facilitate remembering your login information, to allow you to save website preferences, to personalise content and ads, to provide social media features and to analyse our traffic. We also share information about your use of our site with our social media, advertising and analytics partners.