私は熟練したアドバイザーをコーディングする方法を学びたいので、まず簡単なものを手に入れました。
アイディアは、価格が下からMAを横切ったときにEAが長いポジションを開くことです。
より、価格が戻ってきて、上からMAを横切って、長いポジションが閉められ、ショートが開かれる。
アイデアはシンプルで、下のコードは正しいと思われますが、何も起こりません。
誰かが私のミスがどこにあるのか教えてくれますか?
extern double Lots = 0.01;
extern intスリッパ= 7;
extern string comment = MA_Template;
extern int MagicNumber = 0;
///////////////////////////////////////////////////////////
int ThisBarTrade = 0;
int Position = 0;
int init(){
CalcPosition();
}
int start(){
ダブルMA;
ブールクローズ=偽;
if(ThisBarTrade!= Bars){
MA = iMA(NULL、0,5,0,0,0,0);
//購入条件
if(MA gt; = Bid Position lt; = 0){
CalcPosition();
if(Position lt; 0){
if(CloseSingleSell()== false)return(0);/失敗しましたが、再試行することがあります
}
if(OpenSingleBuy()== false)return(0);/購入できませんが、もう一度やり直す可能性があります
ThisBarTrade =バー;
}
//販売条件
if(MA lt; = Ask Position gt; = 0){
CalcPosition();
if(Position gt; 0){
if(CloseSingleBuy()== false)return(0);/失敗しましたが、再試行することがあります
}
if(OpenSingleSell()== false)return(0);/売りに失敗しましたが、もう一度試すことがあります
ThisBarTrade =バー;
}
}
}
// ----------------------------------------------- -------------------
void CalcPosition(){
位置= 0;
for(int i = 0; i lt; OrdersTotal(); i ){
OrderSelect(i、SELECT_BY_POS、MODE_TRADES);
if(OrderSymbol()== Symbol()){
if(OrderType()== OP_BUY)Position = 1;
if(OrderType()== OP_SELL)位置 - = 1;
}
}
}
bool CloseSingleBuy(){
ブールクローズド;
for(int i = 0; i lt; OrdersTotal(); i ){
OrderSelect(i、SELECT_BY_POS、MODE_TRADES);
if(Symbol()== OrderSymbol()MagicNumber == OrderMagicNumber()){
if(OrderType()== OP_BUY){
while(!IsTradeAllowed())スリープ(MathRand()/10);
RefreshRates();
クローズ= OrderClose(OrderTicket()、OrderLots()、Bid、Slippage、White);
印刷(注文を閉じることを試みる# i 入札)。
if(closed == -1){
return(false);
} else {
return(true);
}
}
}
}
return(false);
}
bool CloseSingleSell(){
ブールクローズド;
for(int i = 0; i lt; OrdersTotal(); i ){
OrderSelect(i、SELECT_BY_POS、MODE_TRADES);
if(Symbol()== OrderSymbol()MagicNumber == OrderMagicNumber()){
if(OrderType()== OP_SELL){
while(!IsTradeAllowed())スリープ(MathRand()/10);
RefreshRates();
クローズ= OrderClose(OrderTicket()、OrderLots()、Ask、Slippage、White);
印刷(CloseSingleSell注文を試行する# i 質問);
if(closed == -1){
return(false);
} else {
return(true);
}
}
}
}
return(false);
}
bool OpenSingleBuy(){
if(Position!= 0)return(false);
intチケット= -1;
while(!IsTradeAllowed())スリープ(MathRand()/10);
RefreshRates();
チケット= OrderSend(Symbol()、OP_BUY、Lots、Ask、Slippage、0.0、0.0、comment buy、MagicNumber、0、Lime);
if(チケットlt; 0){
印刷(OpenSingleBuyに失敗した、エラー#、GetLastError());
return(false);
} else {
印刷(OpenSingleBuyで正常に注文された);
return(true);
}
return(false);
}
bool OpenSingleSell(){
if(Position!= 0)return(false);
intチケット= -1;
while(!IsTradeAllowed())スリープ(MathRand()/10);
RefreshRates();
チケット= OrderSend(シンボル()、OP_SELL、ロット、ビッド、スリッパ、0.0、0.0、コメント 売り、MagicNumber、0、Lime);
if(チケットlt; 0){
印刷(OpenSingleSellに失敗した、エラー#、GetLastError());
return(false);
} else {
印刷(OpenSingleSellで注文が正常に行われました)。
return(true);
}
return(false);
}