if(OrderType()==OP_BUY) { while(fastma < slowma) //Use if not while { ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE); if(ticket < 1) //ticket is a local variable and has not been assigned a value { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Buy order closed : ", OrderClosePrice()); } else Print("Error closing order : ", GetLastError()); return(0); } }
複数の通貨ペアや時間枠でEAを使用する場合、もう一つ非常に重要なことがあります。
あなたのコードは「マジックナンバー」選択を使用せず、履歴の未決済注文をチェックする際に使用されているシンボル(「マジックナンバー」も)をチェックしません。したがって、本質的にあなたのEAは、それ自身や他のEAと正しく動作しません。
このままでは、他のEAが動作していない状態で、このEAを単独で使用することしかできず、他のチャート上でこのEAを使用することもできません。
bool ans;
//You do not select an order
if(OrderType()==OP_BUY){
while(fastma < slowma) //Use if not while
{
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
if(ticket < 1) //ticket is a local variable and has not been assigned a value
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Buy order closed : ", OrderClosePrice());
}
else
Print("Error closing order : ", GetLastError());
return(0);
}
}
これまでの私のコードとあなたの時間を助けていただき、どうもありがとうございました。
EAのロジックに問題があるようですので、MetaQuotesの サンプルコード「Moving Average.mq4」「MACD Sample.mq4」を見て、EAの基本原理を理解するまで、それを基に構築することをお勧めします。
ファイルを添付しましたが、"MQL4Experts "フォルダーにあります。
EDIT: コードに関して、あなたはOrderSelectを 使用していますが、それが毎回うまくいくことを常に想定しているのです。そして、うまくいかないときは、OrderTicket() のような注文の詳細関数をクローズで使い続けるだけで、最初のOrderSelect() も失敗すれば、失敗する可能性があるのです。
あなたの編集に気づいた後......。
私はずっと、新しいティックがあるとOrderSelect()は失われるものと思っていました。
そこで調べて みると、一度選択された注文は、その後の新しいティックでも選択されたままであることがわかりました。
毎日、新しいことを学んでいます :)
私はこれまで、新しいティックがあるとOrderSelect()は失われると考えていました。
そこで調べてみると、一度選択された注文は、その後の新しいティックでも選択されたままであることがわかりました。
毎日、新しいことを学んでいます :)
複数の通貨ペアや時間枠でEAを使用する場合、もう一つ非常に重要なことがあります。
あなたのコードは「マジックナンバー」選択を使用せず、履歴の未決済注文をチェックする際に使用されているシンボル(「マジックナンバー」も)をチェックしません。したがって、本質的にあなたのEAは、それ自身や他のEAと正しく動作しません。
このままでは、他のEAが動いていない状態で、このEA単体でしか使用できず、他のチャートでこのEA単体でも使用できません
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) continue;
//---Check Order Type
if(OrderType()==OP_BUY)
{
if(fastma < slowma)
{
if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
else
Print("Error : ", GetLastError());
return(0);
break;
}
if(OrderType()==OP_SELL)
{
if(fastma > slowma)
{
if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
else
Print("Error : ", GetLastError());
return(0);
break;
}
}
これはOrderCloseセクションで、Invalid ticketエラーは出なくなりましたが、Invalid priceが出るようになりました。
これはログから直接です
2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: invalid price 1.05454000 for OrderClose function(オーダークローズ関数が 無効な価格です。
{
if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
...
{
if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
OrderCloseセクションで、Invalid ticketエラーは出なくなったが、Invalid priceが出るようになった。
以下はログから直接です。
2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: invalid price 1.05454000 for OrderClosefunction(オーダークローズ関数に無効な価格があります。
クローズ時にBid/Askを使用しないで、OrderClosePrice()を使用してください。これは自動的に良い価格になります。
OrderClose関数で置き換えればいいのでしょうか?また、その場合、その下のprint関数 でOrderClosePriceを削除すればいいのでしょうか?
編集してください。
私はちょうどそれをしました、しかし今それはどのポジションも開いたままではありません。ただ、ポジションを開いたり閉じたりするだけで、複数のペアで動作することに問題はありません。
if(OrderType()==OP_BUY)
{
if(fastma < slowma)
{
if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
Print("Order Closed : ", OrderClosePrice());
return(0);
}
else
Print("Error : ", GetLastError());
return(0);
break;
}
ループを完了させる必要があるため、リターンやブレークは必要ありません。
また、このエラー表示は
if(fastma < slowma)
が false であることに依存しており、OrderClose() が失敗したかどうかには関係しません。
if(OrderType()==OP_BUY)
{
if(fastma<slowma)
{
if(OrderClose(OrderTicket(),Lots, OrderClosePrice(),10,clrNONE))
Print("Order Closed : ",OrderClosePrice());
else
Print("Error : ",GetLastError())
}
}