if (SAR_Prev>LastClose && SAR_Prev2<LastClose2) { int ticket_sell=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Ask+StopLoss*Point,Bid-TakeProfit*Point,",111,0,Red); Alert ("Assigned value to ticket_sell variable ", ticket_sell); を返します。 } }
アラート(「存在するポジション = ", position_exists, "Buy order ", ticket_buy, "Sell order ", ticket_sell」)。
// Простой параболик. Переворотная стратегия.// В условиях, когда в терминале уже есть открытые позиции по другим инструментам.inputdouble TakeProfit =2500;
inputdouble StopLoss =400;
inputdouble Lots =1;
inputdouble TrailingStop =100;
inputdouble Parameter1 =0.02; // Параметры индикатора PSARinputdouble Parameter2 =0.2;
voidOnTick()
{
int position_exists; // Переменная, принимающая значения 0 или 1. Указывает, открыта ли позиция по интструменту EURUSD// Занесение в переменные значений индикатора на последнем и предпоследнем закрывшихся барах double SAR_Prev=iSAR(NULL,0,Parameter1,Parameter2,1);
double SAR_Prev2=iSAR(NULL,0,Parameter1,Parameter2,2);
// Занесение в переменные цен закрытия на последнем и предпоследнем барахdouble LastClose=iClose(NULL,0,1);
double LastClose2=iClose(NULL,0,2);
//--------------------------------------------------------------------- // Блок, который определяет, открыта ли позиция по инструменту EURUSD// путём перебора всех открытых ордеров терминала в цикле. // Если позиция открыта, то переменной position_exists будет присвоено значение 1int cnt;
string sym;
int type;
int total=OrdersTotal();
position_exists=0;
for (cnt=0; cnt<=total-1; cnt++)
{
bool select=OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
sym=OrderSymbol();
type=OrderType();
if (sym=="EURUSD" && (type==1 || type==0))
{
position_exists=1;
break;
}
}
//--------------------------------------------------------------------- // Если позиция по EURUSD не существует, то проверяем условия открытия сделки if(position_exists==0)
{
if (SAR_Prev<LastClose && SAR_Prev2>LastClose2)
{
int ticket_buy=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Bid-StopLoss*Point,Ask+TakeProfit*Point," ",111,0,Blue);
Alert ("Присвоили значение пременной ticket_buy ", ticket_buy);
return;
}
if (SAR_Prev>LastClose && SAR_Prev2<LastClose2)
{
int ticket_sell=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Ask+StopLoss*Point,Bid-TakeProfit*Point," ",111,0,Red);
Alert ("Присвоили значение пременной ticket_sell ", ticket_sell);
return;
}
}
Alert ("Существование позиции = ", position_exists, " Ордер на покупку ", ticket_buy, " Ордер на продажу ", ticket_sell);
//--------------------------------------------------------------------- // Если позиция по EURUSD существует, то проверяем условия закрытия позиции if (position_exists==1)
{
if (ticket_sell==0) // Если открытой позиции на продажу нет, то выбираем открытый ордер на покупку по тикету
{bool select_buy=OrderSelect(ticket_buy,SELECT_BY_TICKET,MODE_TRADES);}
if (ticket_buy==0) // Если открытой позиции на покупку нет, то выбираем открытый ордер на продажу по тикету
{bool select_sell=OrderSelect(ticket_sell,SELECT_BY_TICKET,MODE_TRADES);}
if(OrderType()==OP_BUY)
{
if(SAR_Prev>LastClose && SAR_Prev2<LastClose2) // Проверяем уловия для закрытия длинной позиции
{
bool close_buy=OrderClose(OrderTicket(),OrderLots(),Bid,0,Violet);
return;
}
}
if(OrderType()==OP_SELL)
{
if(SAR_Prev<LastClose && SAR_Prev2>LastClose2) // Проверяем уловия для закрытия короткой позиции
{
bool close_sell=OrderClose(OrderTicket(),OrderLots(),Ask,0,Violet);
return;
}
}
}
}
if (SAR_Prev>LastClose && SAR_Prev2<LastClose2) { int ticket_sell=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Ask+StopLoss*Point,Bid-TakeProfit*Point,",111,0,Red); Alert ("Assigned value to ticket_sell variable ", ticket_sell); を返します。 } }
アラート(「存在するポジション = ", position_exists, "Buy order ", ticket_buy, "Sell order ", ticket_sell」)。
この機能を使った仕事はしたことがないんです。端末が一度文字を選択した場合、次に同じ文字を選択しようとすると偽を返す可能性があることが前提である。この関数による戻り値のチェックは無視するようにしてください。
SymbolSelect("AUDUSD", true) は、AUDUSD が MarketWatch にない場合、つまりペアが MarketWatch に追加されたときのみ true を返すことがわかりました。一旦ペアがMarketWatchに入ると、それ以降の呼び出しはfalseを返します。
この動作は、この機能のマニュアルと全く一致していません。
SymbolName(i, true) fori=0.SymbolsTotal(true) を全てスキャンする自作関数を使う必要がありました。
SymbolSelect("AUDUSD", true) は、AUDUSD が MarketWatch にない場合、つまりペアが MarketWatch に追加された場合のみ true を返すことが判明しました。一旦ペアがMarketWatchに入ると、それ以降の呼び出しはfalseを返します。
この動作は、この機能のマニュアルと全く一致していません。
なんか、SymbolSelect()はなくても大丈夫な気がする。
ええ、ちょうど上の記事を更新しました。
もう一つは何か、これはもう足でやった方がいいのか!?
マスターフォレックス
アルパリでフクロウを作るのに4ヶ月かかった......。nano quantoのコードは非常にクソ時間がかかるし、小さくない...そして今、すべてが!!!!惜しいどうすればいいのか、まったくわからない。
3度目のフクロウでもまだ同じエラーです。)
マスターフォレックス
ありがとうございます!見てみます。
ありがとうございます!見てみますね。
キャンペーンではなく、質問に答えただけです :)
皆さん、こんにちは。私がEAを書き始めたのは、少し前のことです。一見初歩的な問題に直面し、解決できないでいます。 助けてください。
問題です。新しいティックでは、変数の値が失われます。
短い説明文です。OrderSend()関数の戻り値を変数に代入し、returnコマンドで終了します。 次のtickで変数値は0になります。
ソースコードの重要な要素です。以下、ソースコード全文。
if (SAR_Prev>LastClose && SAR_Prev2<LastClose2)
{
int ticket_sell=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Ask+StopLoss*Point,Bid-TakeProfit*Point,",111,0,Red);
Alert ("Assigned value to ticket_sell variable ", ticket_sell);
を返します。
}
}
アラート(「存在するポジション = ", position_exists, "Buy order ", ticket_buy, "Sell order ", ticket_sell」)。
結果
スクリーンショットは、ポジションが正常に開設され、注文チケットがticket_sell変数に記憶されたことを示しています。ただし、ticket_sell変数は次のティックで0になる。また、チケットの注文を修正・削除することができません。
皆さん、こんにちは。私がEAを書き始めたのは、少し前のことです。一見初歩的な問題に直面し、解決できないでいます。 助けてください。
問題です。新しいティックでは、変数の値が失われます。
短い説明文です。OrderSend()関数の戻り値を変数に代入し、returnコマンドで終了します。 次のティックで変数値は0になります。
ソースコードの重要な要素です。以下、ソースコード全文。
if (SAR_Prev>LastClose && SAR_Prev2<LastClose2)
{
int ticket_sell=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Ask+StopLoss*Point,Bid-TakeProfit*Point,",111,0,Red);
Alert ("Assigned value to ticket_sell variable ", ticket_sell);
を返します。
}
}
アラート(「存在するポジション = ", position_exists, "Buy order ", ticket_buy, "Sell order ", ticket_sell」)。
結果
スクリーンショットは、ポジションが正常に開設され、注文チケットがticket_sell変数に記憶されたことを示しています。ただし、ticket_sell変数は次のティックで0になる。また、チケットの注文を修正・削除することができません。
値を失わないためには、グローバル変数が必要で、その宣言をOnTick() の外に置くか、静的変数 にします