初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 27

 
Movlat Baghiyev:
クローズ条件がリバースシグナルを使用しているのですが、うまくいきません。

間違っている。
条件はスタート時、クローズ機能はスタート後にしてください。

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;
  }

一度に閉じるのではなく、別々の条件で閉じる必要があるのなら、閉じる関数は別のものにすべきです。
 
Natashe4ka:

間違っている。
最初に条件を、そして最後に閉じる関数を用意する必要があります。

一度に閉じるのではなく、個々の条件ごとに閉じる必要がある場合は、閉じる機能を別のものにする必要があります。

そうですね、でももうやって送ってしまったので、何も言われないでしょう。

int start()
{
    //закрытие по МА-шкам
   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);
                          }
                     }
               }
         }
   }
 
Renat Akhtyamov,Natashe4ka ありがとうございました。

 
lot=NormalizeDouble(AccountBalance()*MaximumRisk/(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*100),1);
ロットはこのように計算されます。MaximumRisk==100 ...私は、ロットが自動的に最大値まで計算されることが必要です。トレード開始時の最大ロットを計算するためにMaximumRisk==100と書きました。 何回くらいが正しいのでしょうか?
 
Movlat Baghiyev:
lot=NormalizeDouble(AccountBalance()*MaximumRisk/(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*100),1);
ここでは、ロット計算のバリエーションを紹介します。MaximumRisk==100 ロットごとに自動的に計算されるようにしたい。取引開始時の最大可能ロットを計算するために、MaximumRisk==100と規定しました。

残高ではなく、使用可能な資金をベースにカウントするのがよいでしょう。そうでないと、取引開始の時点で、自分の許容範囲を超えてしまう危険性があります。

また、ロットステップの依存関係を計算し、そのロットが口座で許容される最大ロットと最小ロットの範囲内であるかどうかを確認する必要があります。

int MaximumRisk=100;
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;
 
Vitalie Postolache:


了解です、ありがとうございます。
 
Vitalie Postolache:

残高ではなく、使用可能な資金をベースにカウントするのがよいでしょう。そうでないと、取引開始の時点で、自分の許容範囲を超えてしまう危険性があります。

また、ロットステップの依存関係を計算し、そのロットが口座で許容される最大ロットと最小ロットの範囲内であるかどうかを確認する必要があります。

int MaximumRisk=100;
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;
このオプションは、最大限のロットで1つの取引を開き、第二を閉じた後、十分なお金ではない第二の書き込みを開くことはありません...として動作しません。
 

延期となりました。

ゲボルグ・ハコビヤン さん 2016.12.08 15:26

こんにちは。Meta Trader 4に存在するすべての通貨ペアのリストを取得するにはどうすればよいですか?また、リストに変更があった場合、どのように把握すればよいのでしょうか?
 
Vladimir Karputov:

延期となりました。

ゲボルグ・ハコビヤン さん 2016.12.08 15:26

こんにちは。Meta Trader 4に存在するすべての通貨ペアのリストを取得するにはどうすればよいですか?また、リストの変更に気づくにはどうすればいいのでしょうか?

シンボル合計

利用可能な(MarketWatchで選択された、またはすべての)シンボルの数を返します。

intSymbolsTotal()
bool selected// true - MarketWatchのシンボルのみ
);

パラメータ

せんたんてき

[in] リクエストモード。値としてtrueまたはfalseを取ることができる。

戻り値

selected が true の場合、MarketWatch で選択された文字数が返される。falseの場合、全てのシンボルの総数を返す。

 
Vladimir Karputov:

延期となりました。

ゲボルグ・ハコビヤン さん 2016.12.08 15:26

こんにちは。Meta Trader 4に存在するすべての通貨ペアのリストを取得するにはどうすればよいですか?また、リストに変更があった場合、どのように把握すればよいのでしょうか?
また、転送されたものから、クロスプラットフォームで動作するコードを書くことは不可能なのでしょうか、2つのプラットフォームでシンボルを取得することからタスクに違いはないのです。