マルチカレンシーアドバイザーに関する質問 - ページ 13

 

おはようございます。

アドバイスをお願いします。多通貨EAではこのように各ペアごとにポジションが開設されます。

//ЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮ
//-------------------------Изначальная позиция ----------
if ( Trade && pb==0 && (iBarShift("EURCHF_FX", timeFr, OpenTime1)!= 0) 
//если нет открытых дл. позиций и не было на этом баре
   && Bid_< Lbid+ Delta* Point_){
if ( iMA("EURCHF_FX",0, period_MA,0,MODE_SMMA,PRICE_MEDIAN,0)< iClose("EURCHF_FX", period_TF,0)
// || !Filter_DT)  { //если фильтр разрешает  
   SL=0; TP=0;
if( StopLoss>0)   SL= Ask_- Point_* StopLoss;
if( TakeProfit>0) TP= Ask_+ Point_* TakeProfit;   
ticket= WHCOrderSend("EURCHF_FX",OP_BUY, Lots, Ask_,3, SL, TP,"_001", Magic,0,Blue);
if( ticket < 0) { Print("Ошибка открытия ордера BUY EURCHF_FX  #", GetLastError()); 
               Sleep(10000);   return (0); }
 initorders();               
OpenTime1 = iTime("EURCHF_FX", timeFr,0);
   }}
//жжжжжжжжж Дополнительная позиции жжжжжжжжжжжжжжжжж 
if ( NumberOfPositions("EURCHF_FX",OP_BUY, Magic)==1 && 
NumberOfPositions("EURCHF_FX",OP_BUY, Magic_2)<1) {
//если открыта начальная позици
 if ( GetProfitOpenPosInPoint("EURCHF_FX",OP_BUY, Magic)<= LEVEL_1
  && iBarShift("EURCHF_FX", timeFr, OpenTime1)!= 0) {
//и если убыток начальн. позиции больше заданного значения
 SL=0; TP=0;
if( StopLoss>0)   SL= Ask_- Point_* StopLoss;
if( TakeProfit>0) TP= Ask_+ Point_* TakeProfit;   
ticket= WHCOrderSend("EURCHF_FX",OP_BUY, Lots+ dL2, Ask_,50, SL, TP,"002", Magic_2,0,Blue);
if( ticket < 0) { Print("Ошибка открытия ордера BUY EURCHF_FX #", GetLastError()); 
               Sleep(10000);   return (0); }
            
OpenTime1 = iTime("EURCHF_FX", timeFr,0);
   } } 
//ЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮЮ

アドバイスをお願いします。このブロックの代わりに別の関数を書くにはどうしたらよいでしょうか。

では、ペアごとにこのブロックを書き直す必要はないのですか?

(ブロックはI.KimのfiとMarket Watchのオープニングfiを使用しています)。

 
Rita писал(а)>>

おはようございます。

アドバイスをお願いします。多通貨EAで各ペアのポジションを建てる方法はこのようになります。

アドバイスをお願いします。このブロックの代わりに別の関数を書くにはどうしたらよいでしょうか。

では、ペアごとにこのブロックを書き直す必要はないのですか?

(成行注文の執行条件として、I.Kim's fiとMarket Watch opening fiを使用しました)。

void FUN(文字列_Symbol){。

// あなたのコードですが、シンボルの代わりに _Symbol を使っています。

}

 

ありがとうございます。各ペアのbid、ask、Delta、Lots、bool TRADE(これは入力許可)はどうなっていますか?

これでよいのでしょうか?-

void FUN(string _Symbol, bool TRADE, double _BID, double _AZK,
         double _Delta,  double _LOTS){

またあるカスタム関数を別の関数の中で使う(呼び出す)のは間違っていると、ちらっと聞いたことがあるような気がします。

そして、ブロック内の関数を使って、成行 注文執行で ポジションをオープンしています Market Watch

int WHCOrderSend(string symbol,   int cmd,   double volume, 
                 double price,int slippage,double stoploss, 
                 double takeprofit,string comment, nt magic, 
                 datetime expiration,   color arrow_color)
{  int ticket = OrderSend( symbol, cmd, volume, price, slippage, 0, 0, comment,
magic, expiration, arrow_color);                              int check = -1;
if ( ticket > 0 && ( stoploss != 0                      || takeprofit != 0)) {
if(!OrderModify( ticket, price, stoploss, takeprofit, expiration, arrow_color)) {
check = GetLastError();                         if ( check != ERR_NO_ERROR) {
Print("OrderModify error: ", ErrorDescription( check)); }   }   }      else {
check = GetLastError();                          if ( check != ERR_NO_ERROR){
Print("OrderSend error: ", ErrorDescription( check));   }}   return ( ticket);}
トラブルや故障はないのですか?
 
Rita писал(а)>>

ありがとうございます。各ペアのbid、ask、Delta、Lots、bool TRADE(これは入力許可)はどうなっていますか?

これでよいのでしょうか?-

またあるカスタム関数を別の関数の中で使う(呼び出す)のは間違っていると、ちらっと聞いたことがあるような気がします。

また、私のブロックでは、成行注文の約定条件でポジションを開くための機能を使用しています Market Watch

不具合や故障はないのでしょうか?

double _Bid=MarketInfo(_Symbol, MODE_BID)。

double _Ask=MarketInfo(_Symbol, MODE_ASK);

....................................................................

呼び出し機能はどこにでもある。問題はないでしょう。

 
OKです。ありがとうございます。
 

こんにちは。

マルチカレントトラックでトロールを使用しています。こんな感じです。

void TrailPositions() // функция трейлинг стоп
{
  int Orders = OrdersTotal();
  for (int i=0; i< Orders; i++) {
    if (!(OrderSelect( i, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;
     if (OrderMagicNumber() == Magic ){ 
//--------------------------------------   
     if (OrderType() == OP_BUY )  {
      if (Bid-OrderOpenPrice() > MinProfit*Point) {
        if (OrderStopLoss() < Bid-( TrailingStop+ TrailingStep-1)*Point) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid- TrailingStop*Point,
                                                     OrderTakeProfit(), 0, Blue);
        }}}
//-----------------------------------------
     if (OrderType() == OP_SELL)  {
      if (OrderOpenPrice()-Ask > MinProfit*Point) {
        if (OrderStopLoss() > Ask+( TrailingStop+ TrailingStep-1)*Point 
                                                       || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+ TrailingStop*Point,
                                                      OrderTakeProfit(), 0, Blue);
        }}} 
//---------------------------------------------  
 }   }  }

多通貨のすべてのペアでトロールを使用するために、このように作り直しました。

(Bid-asking-pointsはMarketInfo(Symbol_1,MODE_ASK)で呼び出される。

void TrailPositions(string _Symbol,
                    double _BID,
                    double _AZK,
                    double _Point,
                    int MAGIC,
                    int MinProfit,
                    int TrailingStop,
                    int TrailingStep) 
{  int Orders = OrdersTotal();  for (int i=0; i< Orders; i++) {
    if (!(OrderSelect( i, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != _Symbol) continue;
     if (OrderMagicNumber() == MAGIC){ 
//----------------------------------------------------   
     if (OrderType() == OP_BUY )  {
      if (_BID-OrderOpenPrice() > MinProfit*_Point) {
        if (OrderStopLoss() < _BID-( TrailingStop+ TrailingStep-1)*_Point) {
          OrderModify(OrderTicket(), OrderOpenPrice(), _BID- TrailingStop*_Point,
                                                     OrderTakeProfit(), 0, Blue);
        }      }    }
//-------------------------------------------------------
    if (OrderType() == OP_SELL)  {
      if (OrderOpenPrice()- _AZK > MinProfit*_Point) {
        if (OrderStopLoss() > _AZK+( TrailingStop+ TrailingStep-1)*_Point 
                                                       || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), _AZK+ TrailingStop*_Point,
                                                      OrderTakeProfit(), 0, Blue);
        }   }   } 
//--------------------------------------------------------------
   }   }  }

Expert Advisorは、始値で動作します。

トロールはこんな風に呼ばれます。

if ( UseTrailing_1) {//выключатель трейлинг стопа 1 пары
if(iTime( Symbol_1, TimeFR_1,0)== prevtime) return(0);//ждём появления нового бара
    prevtime = iTime( Symbol_1, TimeFR_1,0);//если появился новый бар , включаемся 
TrailPositions( Symbol_1, Bid1, Ask1, Point1, Magic_1, MinProfit_1,
                                      TrailingStop_1, TrailingStep_1);}
//-------------------------------------------------------------------------------  
 
if ( UseTrailing_2){//выключатель трейлинг стопа 2 пары
if(iTime( Symbol_2, TimeFR_2,0)== prevtime) return(0);//ждём появления нового бара
    prevtime = iTime( Symbol_2, TimeFR_2,0);//если появился новый бар , включаемся 
TrailPositions( Symbol_2, Bid2, Ask2, Point2, Magic_2, MinProfit_2,
                                      TrailingStop_2, TrailingStep_2);}

しかしこの設定では、トロールは動作しません。

ある記号のトロールを外すと、別の組のトロールが動き出す。

コード内に両方のトレールペアコールが存在する場合、いずれも動作しない。

アドバイスをお願いします。どこがエラーになる可能性がありますか?

 

商品と時間枠ごとに異なるprevtimeを使用する必要があります。

 

Vinin さん、ありがとうございました。

各ペアのトローリングを自分で書こうと思っていたところでした...。

 

マルチカレンシーアドバイザーを支援する。

EAを書きました。EURUSD <-> GBPUSDの2つのペアで同時に注文をオープン/クローズすることができます。EURUSDにリンクしています。両ペアの気配値を読み取る(iOpen)。以下のコマンドが実行されます。

Ask_EUR = MarketInfo("EURUSD", MODE_ASK);

Bid_EUR = MarketInfo("EURUSD", MODE_BID);

そして、これらのコマンドは実行されません

Ask_GBP = MarketInfo("GBPUSD", MODE_ASK);

Bid_GBP = MarketInfo("GBPUSD", MODE_BID)。

値 アスク=ビッド=0

何が問題なのか、教えてください。

 
MARKET OVERVIEWウィンドウに2つ目のペアが存在するか?