指定された期間および/またはSLが経過したら、自動的に注文を終了する - ページ 3

 

これは非常に間違っています ... .

OrderSelect(BuyTicket || SellTicket, SELECT_BY_TICKET);

(BuyTicket || SellTicket) は真か偽になります ... そしてこの場合、真か偽は1か0とみなされます ... あなたのSellTicketまたはBuyticketの数ではありません ... ...

ストップロス = 40 ... ... OrderSendでストップロスを使用する場合、それは価格です ... ... ピップ数ではありません、スリッページはピップ数です ... ドキュメントをお読みください。オーダーセンド

ストップロス - ストップロスのレベル。
テイクプロフィット - 利食いレベル
 

ということは、OrderSelectを 使いながら注文を選択するコマンドが必要なのでしょうか?

 

ドキュメントを読んでください。 OrderLots, OrderTicket, OrderOpenPrice などを使用する前にOrderSelect が注文を選択するために必要です "Note: 注文は、以前に OrderSelect() 関数によって選択されていなければ なりません "

もし、既存の注文に関連する情報を使用する必要がなければ、OrderSelect は必要ありません。

 
RaptorUK:

ドキュメントを読んでください。 OrderLots, OrderTicket, OrderOpenPrice などを使用する前にOrderSelect が注文を選択するために必要です "Note: 注文は、以前に OrderSelect() 関数によって選択されていなければ なりません "

もし、既存の注文に関連する情報を使用する必要がなければ、OrderSelect は必要ありません。


現在、私はこの情報が必要だと考えています。なぜなら、マーケットにポジションがある場合、それをクローズし、別のポジションに置き換える必要があるからです。OrderSelectがこのように助けてくれると思いました。しかし、もしOrderselectが未決済注文だけで、市場での有効なポジションのためのものでないなら、それは有用ではありません。そうでしょうか?

しかし、もしOrderSelectが役に立たなければ、どのようにしてアクティブなポジションをクローズすればよいのでしょうか?

よろしくお願いします。

Marc

 
もし、保留中の注文 を使用せず、未決済の注文がある場合、それらは買いまたは売り ... 成行注文となります。
 
//+------------------------------------------------------------------+
//| Der Stundentrader.mq4 |
//| Der Marc |
//| Es gibt gar keine Internetseite |
//+------------------------------------------------------------------+
#property copyright "Der Marc"
#property link "Es gibt gar keine Internetseite"

//Wichtige Variablen
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=7;
extern int TradeHour10=10;
extern int TradeHour17=17;
extern int TradeHour18=18;
extern int TradeHour20=20;
extern int TradeHour12=12;
extern int TradeHour23=23;
extern int StopLoss=40;

//Globale Variablen
int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;

int openbuy = 0;
int opensell = 0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(), Slippage);
}

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round);
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round);
double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round);
//===================== Lets determine lot size and risk ===================================
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)          
              {
               bool Closed = OrderClose(OrderTicket() ,OrderLots(), Ask, UseSlippage, Red);           
               openbuy = 0;
              }
           if (OrderType() == OP_SELL)          
              {
               Closed = OrderClose(OrderTicket() ,OrderLots(), Bid, UseSlippage, Red);  
               opensell = 0;         
              }              
          }
       }
    }


//BuyOrder 
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,0,"time trader buy order ",MagicNumber,0,Blue);
}
//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);
} 

//----
return(0);
}
//+------------------------------------------------------------------+
//Pip Point Function
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);
}

//Get Slippage Function
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return (CalcSlippage);
}

This seems to be mostly correct, but now I need to know why the prog only executes the sell order @ 12 & 23...and not the buy orders...?
 

nirvanamac:

これはほとんど正しいようです。しかし、なぜプログは12と23の売り注文だけを実行し、買い注文は実行しないのでしょうか...?

それはおそらくそうです ... そして、それはおそらくあなたがトラップしていないエラーを生成します ... ...

試してください ... ...

//BuyOrder 
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,0,"time trader buy order ",MagicNumber,0,Blue); 
  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);
  if (opensell < 0) Print("OrderSend OP_SELL failed, error: ", GetLastError() );

} 

あなたのOrderCloseは間違っています ... あなたはBuy at Askを開き、Buy you Sellを閉じます ... あなたはSell at Bidを開き、Sell you Buyを閉じます ... あなたはBuy at Askです。

 
RaptorUK:
あなたのOrderCloseは間違っている... ...あなたは買いを閉じるために、アスクで買いを開く... ...あなたは売りを入札で売る、あなたは売りを閉じるために入札で売りを開く...あなたはアスクで買いを買う。
または、すでに注文を選択しているので、単に
Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red);  
また、注文の種類を 区別する必要はありません。
 

ありがとうございました。ヒントを参考にコードを修正しました。このような感じです。

//+------------------------------------------------------------------+
//|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が発動されたことに起因しているのでしょうか?