if ((FMA1<GrossMA1 && FMA2>GrossMA2 && Bid<FMA1-Distanse*GetPoint()) // тут так надо бы Bid<NormalizeDouble(FMA1-Distanse*GetPoint(),Digits) || (FRMA1>GrossMA1 && FRMA2<GrossMA2 && Ask>FRMA1+Distanse*GetPoint())){ for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) CloseOpBuySell(); // тут закроются все ордера и бай и селл } }
クローズ条件がリバースシグナルを使用しているのですが、うまくいきません。
間違っている。
条件はスタート時、クローズ機能はスタート後にしてください。
int i;
//
void Start(){
if ((FMA1<GrossMA1 && FMA2>GrossMA2 && Bid<FMA1-Distanse*GetPoint()) // тут так надо бы Bid<NormalizeDouble(FMA1-Distanse*GetPoint(),Digits)
|| (FRMA1>GrossMA1 && FRMA2<GrossMA2 && Ask>FRMA1+Distanse*GetPoint())){
for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) CloseOpBuySell(); // тут закроются все ордера и бай и селл
}
}
}// end start
void CloseOpBuySell()
{
for(i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic ) //свой магик
{
if(OrderType()==OP_BUY)
{
if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,LawnGreen); {continue;}
}
if(OrderType()==OP_SELL)
{
if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,LawnGreen); {continue;}
}
}
}
}
return;
}
間違っている。
一度に閉じるのではなく、個々の条件ごとに閉じる必要がある場合は、閉じる機能を別のものにする必要があります。最初に条件を、そして最後に閉じる関数を用意する必要があります。
そうですね、でももうやって送ってしまったので、何も言われないでしょう。
{
//закрытие по МА-шкам
if (FMA1<GrossMA1 && FMA2>GrossMA2 && Bid<FMA1-Distanse*GetPoint()) CloseOpBuySell("BUY");
if (FRMA1>GrossMA1 && FRMA2<GrossMA2 && Ask>FRMA1+Distanse*GetPoint()) CloseOpBuySell("SELL");
return(0);
}
//----
//-----------------------------------+
void CloseOpBuySell(string TypeClose)
{
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==mn )
{
if(TypeClose=="BUY")
{
if(OrderType()==OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,3,LawnGreen);
}
if(TypeClose=="SELL")
{
if(OrderType()==OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,3,LawnGreen);
}
}
}
}
}
残高ではなく、使用可能な資金をベースにカウントするのがよいでしょう。そうでないと、取引開始の時点で、自分の許容範囲を超えてしまう危険性があります。
また、ロットステップの依存関係を計算し、そのロットが口座で許容される最大ロットと最小ロットの範囲内であるかどうかを確認する必要があります。
double lots,lotstep,free,margin, lotmin, lotmax;
lotmax=MarketInfo(Symbol(), MODE_MAXLOT);
lotmin=MarketInfo(Symbol(), MODE_MINLOT);
lotstep = MarketInfo(Symbol(), MODE_LOTSTEP);
reqmargin = MarketInfo(Symbol(), MODE_MARGINREQUIRED);
free=AccountFreeMargin();
lots = NormalizeDouble(lotstep*MathRound((free*MaximumRisk*0.01/reqmargin)/lotstep),2);
if (lots < lotmin) lots = lotmin;
if (lots > lotmax) lots = lotmax;
残高ではなく、使用可能な資金をベースにカウントするのがよいでしょう。そうでないと、取引開始の時点で、自分の許容範囲を超えてしまう危険性があります。
また、ロットステップの依存関係を計算し、そのロットが口座で許容される最大ロットと最小ロットの範囲内であるかどうかを確認する必要があります。
double lots,lotstep,free,margin, lotmin, lotmax;
lotmax=MarketInfo(Symbol(), MODE_MAXLOT);
lotmin=MarketInfo(Symbol(), MODE_MINLOT);
lotstep = MarketInfo(Symbol(), MODE_LOTSTEP);
reqmargin = MarketInfo(Symbol(), MODE_MARGINREQUIRED);
free=AccountFreeMargin();
lots = NormalizeDouble(lotstep*MathRound((free*MaximumRisk*0.01/reqmargin)/lotstep),2);
if (lots < lotmin) lots = lotmin;
if (lots > lotmax) lots = lotmax;
延期となりました。
ゲボルグ・ハコビヤン さん 2016.12.08 15:26
こんにちは。Meta Trader 4に存在するすべての通貨ペアのリストを取得するにはどうすればよいですか?また、リストに変更があった場合、どのように把握すればよいのでしょうか?延期となりました。
ゲボルグ・ハコビヤン さん 2016.12.08 15:26
こんにちは。Meta Trader 4に存在するすべての通貨ペアのリストを取得するにはどうすればよいですか?また、リストの変更に気づくにはどうすればいいのでしょうか?シンボル合計
利用可能な(MarketWatchで選択された、またはすべての)シンボルの数を返します。
intSymbolsTotal()
bool selected// true - MarketWatchのシンボルのみ。
);
パラメータ
せんたんてき
[in] リクエストモード。値としてtrueまたはfalseを取ることができる。
戻り値
selected が true の場合、MarketWatch で選択された文字数が返される。falseの場合、全てのシンボルの総数を返す。
延期となりました。
ゲボルグ・ハコビヤン さん 2016.12.08 15:26
こんにちは。Meta Trader 4に存在するすべての通貨ペアのリストを取得するにはどうすればよいですか?また、リストに変更があった場合、どのように把握すればよいのでしょうか?