//+------------------------------------------------------------------+ //|Der Stundentrader.mq4|... //| マルク /// Es gibt gar keine Internetseite (インターネットサイトはありません) //+------------------------------------------------------------------+ #property copyright"Der Marc" #property link "Es gibt garine keine Internetseite" (インターネットは存在しない)
//重要な変数 extern double Minlot=0.01; extern int Digits2Round=2; extern int PercentOfFreeDepo=1; extern int Slippage=5; extern int MagicNumber =1; extern int TradeHour3=3; extern int TradeHour4=4; extern int TradeHour7=3; extern int TradeHour8=4; extern int TradeHour7=7; extern int TradeHour4=4; extern int TradeHour7=7; extern int TradeHour10=10; extern int TradeHour7=7; extern int TradeHour10=10; extern int TradeHour17=17; extern int TradeHour10=10; extern int TradeHour17=17; extern int TradeHour18=18; extern int TradeHour17=17; extern int TradeHour18=18; extern int TradeHour20=20; extern int TradeHour18=18; extern int TradeHour20=20; extern int TradeHour12=12; extern int TradeHour23=23; 外部変数 int StopLoss=400;
//グローバル変数 int BuyTicket; int SellTicket; double UsePoint; int UseSlippage;
int openbuy = 0; int opensell = 0; //+------------------------------------------------------------------+ //| エキスパート初期化関数 //+------------------------------------------------------------------+ int init() { UsePoint = PipPoint(Symbol())。 UseSlippage = GetSlippage(Symbol(), Slippage); }
これは非常に間違っています ... .
OrderSelect(BuyTicket || SellTicket, SELECT_BY_TICKET);
(BuyTicket || SellTicket) は真か偽になります ... そしてこの場合、真か偽は1か0とみなされます ... あなたのSellTicketまたはBuyticketの数ではありません ... ...
ストップロス = 40 ... ... OrderSendでストップロスを使用する場合、それは価格です ... ... ピップ数ではありません、スリッページはピップ数です ... ドキュメントをお読みください。オーダーセンド
ということは、OrderSelectを 使いながら注文を選択するコマンドが必要なのでしょうか?
ドキュメントを読んでください。 OrderLots, OrderTicket, OrderOpenPrice などを使用する前に、OrderSelect が注文を選択するために必要です "Note: 注文は、以前に OrderSelect() 関数によって選択されていなければ なりません "
もし、既存の注文に関連する情報を使用する必要がなければ、OrderSelect は必要ありません。
ドキュメントを読んでください。 OrderLots, OrderTicket, OrderOpenPrice などを使用する前に、OrderSelect が注文を選択するために必要です "Note: 注文は、以前に OrderSelect() 関数によって選択されていなければ なりません "
もし、既存の注文に関連する情報を使用する必要がなければ、OrderSelect は必要ありません。
現在、私はこの情報が必要だと考えています。なぜなら、マーケットにポジションがある場合、それをクローズし、別のポジションに置き換える必要があるからです。OrderSelectがこのように助けてくれると思いました。しかし、もしOrderselectが未決済注文だけで、市場での有効なポジションのためのものでないなら、それは有用ではありません。そうでしょうか?
しかし、もしOrderSelectが役に立たなければ、どのようにしてアクティブなポジションをクローズすればよいのでしょうか?
よろしくお願いします。
Marc
nirvanamac:
これはほとんど正しいようです。しかし、なぜプログは12と23の売り注文だけを実行し、買い注文は実行しないのでしょうか...?
それはおそらくそうです ... そして、それはおそらくあなたがトラップしていないエラーを生成します ... ...
試してください ... ...
あなたのOrderCloseは間違っています ... あなたはBuy at Askを開き、Buy you Sellを閉じます ... あなたはSell at Bidを開き、Sell you Buyを閉じます ... あなたはBuy at Askです。
あなたのOrderCloseは間違っている... ...あなたは買いを閉じるために、アスクで買いを開く... ...あなたは売りを入札で売る、あなたは売りを閉じるために入札で売りを開く...あなたはアスクで買いを買う。
ありがとうございました。ヒントを参考にコードを修正しました。このような感じです。
//+------------------------------------------------------------------+
//|Der Stundentrader.mq4|...
//| マルク
/// Es gibt gar keine Internetseite (インターネットサイトはありません)
//+------------------------------------------------------------------+
#property copyright"Der Marc"
#property link "Es gibt garine keine Internetseite" (インターネットは存在しない)
//重要な変数
extern double Minlot=0.01;
extern int Digits2Round=2;
extern int PercentOfFreeDepo=1;
extern int Slippage=5;
extern int MagicNumber =1;
extern int TradeHour3=3;
extern int TradeHour4=4; extern int TradeHour7=3; extern int TradeHour8=4;
extern int TradeHour7=7; extern int TradeHour4=4; extern int TradeHour7=7;
extern int TradeHour10=10; extern int TradeHour7=7; extern int TradeHour10=10;
extern int TradeHour17=17; extern int TradeHour10=10; extern int TradeHour17=17;
extern int TradeHour18=18; extern int TradeHour17=17; extern int TradeHour18=18;
extern int TradeHour20=20; extern int TradeHour18=18; extern int TradeHour20=20;
extern int TradeHour12=12;
extern int TradeHour23=23;
外部変数 int StopLoss=400;
//グローバル変数
int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;
int openbuy = 0;
int opensell = 0;
//+------------------------------------------------------------------+
//| エキスパート初期化関数
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol())。
UseSlippage = GetSlippage(Symbol(), Slippage);
}
//+------------------------------------------------------------------+
//| エキスパートスタート機能
//+------------------------------------------------------------------+
int start()
{
double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round).Double Risk=NormalizeDouble(FreeDepo*FreeDepoの割合)。
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round); double Lot=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round);
double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round); double Risk=NormalizeDouble(FreeDepo*Percent Of FreeDepo/100,Digits2Round);
//========================= ロットサイズとリスクを決定します。
if ( Lot<Minlot )
{
Lot=Minlot;
}
Comment( "\n", "Acceptable risk is ",PercentOfFreeDepo,"% = ",Risk, "of the free money ",FreeDepo," in lots = ",Lot");
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if((OrderOpenTime()+3600) < TimeCurrent())
{
if (OrderType() == OP_BUY || OP_SELL)
{
bool Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red);
openbuy = 0;
opensell = 0;
}
if (OrderType() == OP_SELL)
{
Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red);
opensell = 0;
openbuy = 0;
}
}
}
//買い注文
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Signal 買いのシグナル
{
openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,Ask - StopLoss * Point,0, "time trader buy order ", MagicNumber,0,Blue).もし(openbuy < 0)であれば、openbuyは0になります。
if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() );
/SellOrder(売り注文)
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0, "time trader sell order ", MagicNumber, 0,Green).もし(opensell < 0)であれば、opensellは売り注文になります。
if (opensell < 0) Print("OrderSend OP_SELL failed, error: ", GetLastError() );
//----
return(0);
}
//+------------------------------------------------------------------+
//ピップポイント関数
double PipPoint (string Currency)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;
return (CalcPoint);
}
//スリッページ取得関数
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips.P; if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return (CalcSlippage);
}
バックテスト実行中に1つのエラーメッセージ ERR_INVALID_TICKET (4108) が発生しました。
すべての注文が実行されたわけではありません。
もしかして、このエラーは以前にSLが発動されたことに起因しているのでしょうか?