マジックナンバーの配列を作成するには? - ページ 4 1234 新しいコメント Edward Hirsch 2010.12.29 23:44 #31 ジョン 1) 最初の OrderSend() が成功したかどうかを、戻り値が 0 より大きいかどうかをテストすることで、2 番目の注文を行う前に確認します。 2) 最初のOrderSend()は、2番目の注文を試みる前に、戻り値が0より大きいことをテストすることで、成功したことを確認します。 2) 注文のペアを識別して処理するために、注文のペアが異なるタイプで構成されている場合は、次のコードに基づくことができます。 2) 注文のペアが異なるタイプで構成されている場合、以下のコードをベースにすることができる。 を超える場合、またはグループ内の注文がすべて同じタイプの場合、アルゴリズムを変更する必要があります)。 以下のサンプルプログラム "ReportsTrader.mq4 "は、レポートやニュースの発行時刻付近にストラドル注文を発注するものです。 ストラドル注文 ストラドル注文は、市場価格の上下にある2つの未決済注文で 構成されています。一方の 一方の注文が市場価格に到達すると成行注文となり、他方の注文が市場価格に到達すると成行注文となる。 の注文は削除されなければならない。ですから、注文のペアを追跡するためにシーケンス番号が必要なのです。 //+------------------------------------------------------------------+ //| ReportsTrader.mq4 | //| Copyright © 2010, sxTed | //| MailTo: sxTed@gmx.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2010, sxTed" #property link "MailTo: sxTed@gmx.com" //+------------------------------------------------------------------+ //| input parameters: | //+-----------0---+----1----+----2----+----3]------------------------+ extern int ExpertID = 2; extern int StopLoss = 20; extern int TakeProfit = 60; extern int DistanceToMarket = 15; extern double Lots = 0.05; extern bool AlertError = true; //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ void start() { static string Report[4][4] = {"2010.12.30 05:00", "USDJPY", "JPY Purchasing Manager Index" , "0", "2010.12.30 09:00", "EURUSD", "EUR Italian Producer Price Index", "0", "2010.12.30 13:30", "USDJPY", "USD Initial Jobless Claims" , "0", "2010.12.31 00:30", "AUDUSD", "AUD Private Sector Credit" , "0" }; int Position[10][7], iReports=ArrayRange(Report,0), i, k, iPairs, iPipsFactor; int iOrders=OrdersTotal(), iPositions=ArrayRange(Position,0), iSequenceNumber; double dTS, dSL, pp; string sSequenceNumber; //----------------------------------------------------------------- triage of orders if (iOrders > iPositions) iPositions=ArrayResize(Position,iOrders)/iOrders; ArrayInitialize(Position,0); for (i=0; i<iOrders; i++) { if (!OrderSelect(i,SELECT_BY_POS)) continue; if (OrderMagicNumber() != ExpertID) continue; iSequenceNumber = StrToInteger(OrderComment()); for (k=0; k<iPositions; k++) { if (Position[k][6] == iSequenceNumber) { Position[k][OrderType()] = OrderTicket(); break; } if (Position[k][6] == 0) { Position[k][6] = iSequenceNumber; Position[k][OrderType()] = OrderTicket(); iPairs++; break; } } } //----------------------------------------------------------------- maintain straddle orders for (i=0; i<iPairs; i++) { if (Position[i][OP_BUY] > 0) { if (OrderSelect(Position[i][OP_BUY], SELECT_BY_TICKET)) { if ((MarketInfo(OrderSymbol(),MODE_DIGITS) == 5) || (MarketInfo(OrderSymbol(),MODE_DIGITS) == 3)) iPipsFactor = 10; else iPipsFactor = 1; dTS=StopLoss*iPipsFactor*MarketInfo(OrderSymbol(),MODE_POINT); dSL=OrderStopLoss()+dTS*MathFloor((MarketInfo(OrderSymbol(),MODE_BID)-dTS-OrderStopLoss())/dTS); if (MarketInfo(OrderSymbol(),MODE_BID)-dSL >= dTS && dSL > OrderStopLoss()) { if (!OrderModify(OrderTicket(),OrderOpenPrice(),dSL,OrderTakeProfit(),0)) return(Error("OrderModify")); } } } if (Position[i][OP_SELL] > 0) { if (OrderSelect(Position[i][OP_SELL], SELECT_BY_TICKET)) { if ((MarketInfo(OrderSymbol(),MODE_DIGITS) == 5) || (MarketInfo(OrderSymbol(),MODE_DIGITS) == 3)) iPipsFactor = 10; else iPipsFactor = 1; dTS=StopLoss*iPipsFactor*MarketInfo(OrderSymbol(),MODE_POINT); dSL=OrderStopLoss()-dTS*MathFloor((OrderStopLoss()-dTS-MarketInfo(OrderSymbol(),MODE_ASK))/dTS); if (dSL-MarketInfo(OrderSymbol(),MODE_ASK) >= dTS && dSL < OrderStopLoss()) { if (!OrderModify(OrderTicket(),OrderOpenPrice(),dSL,OrderTakeProfit(),0)) return(Error("OrderModify")); } } } if (Position[i][OP_BUYSTOP] > 0 && Position[i][OP_SELLSTOP] == 0) { if (!OrderDelete(Position[i][OP_BUYSTOP])) return(Error("OrderDelete ticket "+Position[i][OP_BUYSTOP])); } if (Position[i][OP_BUYSTOP] == 0 && Position[i][OP_SELLSTOP] > 0) { if (!OrderDelete(Position[i][OP_SELLSTOP])) return(Error("OrderDelete ticket "+Position[i][OP_SELLSTOP])); } } //----------------------------------------------------------------- place new straddle orders for Report for (i=0; i<iReports; i++) { if (Report[i][3] == "0") { if ((TimeGMT() >= StrToTime(Report[i][0])-PERIOD_M5*60) && (TimeGMT() <= StrToTime(Report[i][0]))) { Report[i][3] = "done"; sSequenceNumber=DoubleToStr(SequenceNumber(),0); if ((MarketInfo(Report[i][1],MODE_DIGITS) == 5) || (MarketInfo(Report[i][1],MODE_DIGITS) == 3)) iPipsFactor = 10; else iPipsFactor = 1; pp=MarketInfo(Report[i][1],MODE_ASK)+DistanceToMarket*iPipsFactor*MarketInfo(Report[i][1],MODE_POINT); if (OrderSend(Report[i][1],OP_BUYSTOP,Lots,pp,3,pp-StopLoss*iPipsFactor*MarketInfo(Report[i][1],MODE_POINT),pp+TakeProfit*iPipsFactor*MarketInfo(Report[i][1],MODE_POINT),sSequenceNumber,ExpertID,0,Green) == -1) return(Error("OrderSend OP_BUYSTOP")); RefreshRates(); pp=MarketInfo(Report[i][1],MODE_BID)-DistanceToMarket*iPipsFactor*MarketInfo(Report[i][1],MODE_POINT); if (OrderSend(Report[i][1],OP_SELLSTOP,Lots,pp,3,pp+StopLoss*iPipsFactor*MarketInfo(Report[i][1],MODE_POINT),pp-TakeProfit*iPipsFactor*MarketInfo(Report[i][1],MODE_POINT),sSequenceNumber,ExpertID,0,Red) == -1) return(Error("OrderSend OP_SELLSTOP")); } } } } int Error(string sErrorMessage) { int iErrorNumber=GetLastError(); Print(sErrorMessage," error ",iErrorNumber); if (AlertError) Alert(sErrorMessage," error ",iErrorNumber); return(-1); } //+------------------------------------------------------------------+ //| Function..: SequenceNumber | //| Purpose...: Generate a sequential number. | //| Returns...: dSeqNum - next sequence number. | //| Notes.....: MT4 keeps the value of the global variable at the | //| client terminal for 4 weeks since the last access. | //| Use SequenceNumber() to generate a unique identity | //| for each order (and passed via parameter <magic> | //| number, or converted to a string and passed via the | //| parameter <comment> to the OrderSend() function) as | //| the trade servers of some brokers do modify the | //| ticket number of a pending order when it changes to | //| a market order. | //| The same sequence number could, for example, be used | //| to identify the two positions of a straddle order. | //| ****************************************************** //| * If the expert has to close partial lots, then MT4 * //| * retains in the new order the contents of the * //| * OrderMagicNumber() but loses OrderComment(). * //| ****************************************************** //| Sample....: string sNumber=DoubleToStr(SequenceNumber(),0); | //| if(OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-25*Point, | //| Ask+25*Point,sNumber,16384,0,Green) > 0)| //| OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-25*Point, | //| Ask+65*Point,sNumber,16384,0,Green); | //+------------------------------------------------------------------+ double SequenceNumber() { double dSeqNum=1, d; string sName="SequenceNumber"; while (GlobalVariableCheck("Semaphore")) d+=0; GlobalVariableSet("Semaphore",1); if (GlobalVariableCheck(sName)) dSeqNum=GlobalVariableGet(sName)+1; GlobalVariableSet(sName,dSeqNum); GlobalVariableDel("Semaphore"); return(dSeqNum); } //+------------------------------------------------------------------+ //| Function..: TimeGMT | //| Thank you.: Slawa ref. http://www.metatrader4.com/forum/2435 | //| Purpose...: Retrieve the current system date and time expressed | //| in GMT (UTC) time. | //| Returns...: tGMT. | //+------------------------------------------------------------------+ #import "Kernel32.dll" void GetSystemTime(int& TimeArray[]); #import datetime TimeGMT() { int TimeArray[4]; GetSystemTime(TimeArray); int YY=TimeArray[0]&0x0000FFFF; int MM=TimeArray[0]>>16; int DD=TimeArray[1]>>16; int hh=TimeArray[2]&0x0000FFFF; int mm=TimeArray[2]>>16; int ss=TimeArray[3]&0x0000FFFF; return(StrToTime(StringConcatenate(YY,".",MM,".",DD," ",hh,":",mm,":",ss))); } //+------------------------------------------------------------------+ ファイル: reportstrader_1.mq4 10 kb Chee Chua 2010.12.30 03:51 #32 ありがとうございます。わぁ、あなたのコードを読んで理解するのに時間がかかりそうです... Dean Thomas Whittingham 2019.03.11 06:32 #33 Chee Chuaさんがこの問題を解決したかどうかは知りませんが、私は同じことをするのに非常に近いことをしました。 私のシステムは(最初に入力した内容に基づいて)価格水準を作成し、価格が価格水準に戻り、注文が存在しない場合、注文が出されるように永久的であることを想定しています。これらの価格水準は、各保留注文が forループで作成される際に作成されます。そして、マジックナンバーはpricelevelから導き出されます。 私のコードはこちらで見ることができます。 https://www.mql5.com/en/forum/306224 唯一の問題は、私の数字が取引のPricelevelより1桁少なくなることがあり、解決できないことです。 Anyone want to take a crack at this? 2019.03.11www.mql5.com Hi All, Anyone want to take a crack at this? This code will ask for inputs, so in this case the following were entered 2019.03.11 11:56:18.393 2016... 1234 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
1) 最初の OrderSend() が成功したかどうかを、戻り値が 0 より大きいかどうかをテストすることで、2 番目の注文を行う前に確認します。
2) 最初のOrderSend()は、2番目の注文を試みる前に、戻り値が0より大きいことをテストすることで、成功したことを確認します。
2) 注文のペアを識別して処理するために、注文のペアが異なるタイプで構成されている場合は、次のコードに基づくことができます。
2) 注文のペアが異なるタイプで構成されている場合、以下のコードをベースにすることができる。
を超える場合、またはグループ内の注文がすべて同じタイプの場合、アルゴリズムを変更する必要があります)。
以下のサンプルプログラム "ReportsTrader.mq4 "は、レポートやニュースの発行時刻付近にストラドル注文を発注するものです。
ストラドル注文
ストラドル注文は、市場価格の上下にある2つの未決済注文で 構成されています。一方の
一方の注文が市場価格に到達すると成行注文となり、他方の注文が市場価格に到達すると成行注文となる。
の注文は削除されなければならない。ですから、注文のペアを追跡するためにシーケンス番号が必要なのです。
Chee Chuaさんがこの問題を解決したかどうかは知りませんが、私は同じことをするのに非常に近いことをしました。
私のシステムは(最初に入力した内容に基づいて)価格水準を作成し、価格が価格水準に戻り、注文が存在しない場合、注文が出されるように永久的であることを想定しています。これらの価格水準は、各保留注文が forループで作成される際に作成されます。そして、マジックナンバーはpricelevelから導き出されます。
私のコードはこちらで見ることができます。
https://www.mql5.com/en/forum/306224
唯一の問題は、私の数字が取引のPricelevelより1桁少なくなることがあり、解決できないことです。