初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 74

 
こんにちは!私は2つのシンボル(例えばEURUSDとGBPUSD)を使用する指標を作成 しようとしましたが、それは描画しません(エラー4806を与える)... 私は各シンボルのOnInit関数(例えばiRSI)で指標ハンドルを取得し、指標のデータをバッファにコピーして、それらでさらに操作を実行します......1つのシンボル(チャート上のシンボルと同じシンボルで、インジケータを装着しています)については問題なく受信できますが、2番目のシンボルのインジケータデータは受信できません・・・つまり、装着しているチャート上のシンボルと同じシンボルのデータのみを受信します・・・何が間違っているのでしょうか?
 
FinEngineer:
こんにちは!私は2つのシンボル(例えばEURUSDとGBPUSD)を使用する指標を作成 しようとしましたが、それは描画しません(エラー4806を与える)... 私は各シンボルのOnInit関数(例えばiRSI)で指標ハンドルを取得し、指標のデータをバッファにコピーし、それらでさらに操作を実行します......1つのシンボル(チャート上のシンボルと同じで、インジケータを装着したシンボル)については問題なくインジケータデータを受信しますが、2番目のシンボルについては受信しません・・・つまり、チャート上のシンボルと一致するシンボルのみデータを受信し、それにインジケータを装着します・・・何が間違っているのでしょうか?
だから、問題が発生したコードの部分を示してください。
 

mql4ではもっと簡単だったのですが、慣れていないせいかもしれません...このハンドルと補助バッファが私の脳を殺しているのです。

意味は明確だと思います(相関する2つのシンボルのrsiの差)、助けてください...間違いを指摘してください。

#property copyright "著作権 2012, MetaQuotes Software Corp.
#プロパティリンク "http://www.mql5.com"
#property version "1.00"

//---- インジケーターのレンダリングプロパティ
#プロパティ indicator_buffers 3
#property indicator_label1 "Pair_delta_RSI"(ペアデルタRSI)。
#property indicator_type1 DRAW_LINE
#property indicator_color1 レッド
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
#プロパティ入力パラメータ
入力文字列 Symbol1_Name = "EURUSD";
入力文字列 Symbol2_Name = "GBPUSD";
入力 int PeriodRSI=7;
input bool Inversia=false;
input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE;

doubleRSI_Buffer[]。
double RSI1_Buffer[];
double RSI2_Buffer[];

int RSI1_Handle;
int RSI2_Handle;

int OnInit()
{
SetIndexBuffer(0,DeltaRSI_Buffer,INDICATOR_DATA)を設定。
SetIndexBuffer(1,RSI1_Buffer,INDICATOR_CALCULATIONS)を設定します。
SetIndexBuffer(2,RSI2_Buffer,INDICATOR_CALCULATIONS)を設定します。

RSI1_Handle=iRSI(Symbol1_Name,0,PeriodRSI,PRICE_CLOSE);// インジケーターハンドルの取得
RSI2_Handle=iRSI(Symbol2_Name,0,PeriodRSI,PRICE_CLOSE)とする。
return(0)です。
}

int OnCalculate(const int rates_total,const int prev_calculated,
const datetime &Time[],
const double &Open[],
const double &High[],
const double &Low[],
const double &Close[],
const long &TickVolume[],
const long &Volume[],
const int &Spread[])
{
int calculated=BarsCalculated(RSI1_Handle)。
if(calculated<rate_total)
{
Print("RSI1_Handleの全てのデータが計算されていません(",calculated, "bars ).Error",GetLastError());
return(0)です。
}
calculated=BarsCalculated(RSI2_Handle)。
if(calculated<rate_total)
{
Print("RSI2_Handleの全てのデータが計算されていません(",calculated, "bars ).Error",GetLastError());
return(0)です。
}
//--- すべてのデータをコピーするわけではありません
int to_copy;
if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
さもなくば
{
to_copy=rates_total-prev_calculated とする。
if(prev_calculated>0) to_copy++;
}
//RSI1バッファの受信
if(CopyBuffer(RSI1_Handle,0,0,to_copy,RSI1_Buffer)<=0)
{
Print("RSI1の取得に失敗しました!Error",GetLastError());
return(0)です。
}
//RSI2バッファの取得
if(CopyBuffer(RSI2_Handle,0,0,to_copy,RSI2_Buffer)<=0)
{
Print("RSI2の取得に失敗しました!Error",GetLastError());
return(0)です。
}
//---
int制限。
if(prev_calculated==0)
limit=0とする。
else limit=prev_calculated-1;
//calculate delta rsi indicator
for(int i=limit;i<rate_total; i++)
DeltaRSI_Buffer[i]=RSI1_Buffer[i]-RSI2_Buffer[i] とする。
return(rates_total);
}

Automated Trading and Strategy Testing
Automated Trading and Strategy Testing
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 

エラー1

SRCキーの使用失敗

 

このようなエラーは、例えば、標準のカスタムMACDインジケータを使用して、次の行を変更する場合に発生します。

ExtFastMaHandle=iMA(NULL,0,InpFastEMA,0,MODE_EMA,InpAppliedPrice);

まで

ExtFastMaHandle=iMA("EURUSD",0,InpFastEMA,0,MODE_EMA,InpAppliedPrice)となります。

MACDがEURUSDチャートに添付されている場合、すべてが描画され、他のチャートに添付されている場合 - エラー4806が表示されます... この指標で私が望むだけ多くのシンボルを使用できるようにするにはどうすればよいですか?

以前掲載したインジケーターを動作させる方法を教えて頂ければ幸いです。

 
mario065:

レスター:ここにテンプレートを置いて、中にクロールの方法を示すモディファイを入れました。

https://www.mql5.com/ru/forum/6343/page73

嫌なら、変数を正しく数えることだ。

シャブロンファイルのアイデアは成功例もあり、少し自分の条件にもってきて、うまくいったこともあります。しかし、私にとっては重要なデッドロックがあります - 彼らはティックではなく、次のローソクに設定されています。以下は、EAの部分です。

  double buy_trail = 0;
  double sel_trail = 0;
  double SL,T_P,Open;
  ulong L_S;
  
  if(PositionSelect(_Symbol))
  {
     Open = PositionGetDouble(POSITION_PRICE_OPEN);
     SL   = PositionGetDouble(POSITION_SL);
     T_P  = PositionGetDouble(POSITION_TP);
     Bid  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
     Ask  = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
     L_S  = SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
     buy_trail = NormalizeDouble(Bid - Open,Digits());
     sel_trail = NormalizeDouble(Open - Ask,Digits()); 
    
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
    {
    if(!PositionGetDouble(POSITION_SL))
      {
      PositionModify(_Symbol,NormalizeDouble((Open-STR-TR),Digits()),NormalizeDouble((Open+TP),Digits()));
      }
 
Lester:

様々な成功を収めながら、私はSchablonファイルの要点を掴み、それを私の条件に合わせて少し調整し、万歳-ストップと利益を設定しました。しかし、私にとっては重要なデッドロックがあります - 彼らはティックではなく、次のローソクに設定されています。以下は、そのコードの一部です。

input double TP            = 0.003;
input double STR           = 0.0012;
input double TR            = 0.0002;
//=============================================== 
//Един вид извикване на модификация на отворената позиция
  double buy_trail = 0;
  double sel_trail = 0;
  double SL,T_P,Open;
  ulong L_S;
Ну ладно-обяснения:

  if(PositionSelect(_Symbol)){//Ест ли позиция по символа
     Open = PositionGetDouble(POSITION_PRICE_OPEN);//цена опен для поза
     SL   = PositionGetDouble(POSITION_SL);//цена стоп для поза
     T_P  = PositionGetDouble(POSITION_TP);//цена тейк для поза
     Bid  = SymbolInfoDouble(_Symbol,SYMBOL_BID);//цена бид
     Ask  = SymbolInfoDouble(_Symbol,SYMBOL_ASK);//цена аск
     L_S  = SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);//стоп ниво,если ест такое-оно в пункты
     buy_trail = NormalizeDouble(Bid - Open,Digits());//вычисляем разстояние от цена бид и цена опен позиции-ето для бай
     sel_trail = NormalizeDouble(Open - Ask,Digits());//вычисляем разстояние от цена опен позиции и цена аск-ето для сел
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)//если ест бай поза
      {
      if(buy_trail > STR)//если разстояние болше указаное
       {
        if(NormalizeDouble((Bid - STR),Digits()) >= Open && Open > SL)
//если цена бид минус указаное разстояние болше щем цена опен и цена опен болше цена стоп-вызиваем модификация
//сама модификация-для стоп будет цена опен,цена тейк не меняем.
          {
           ModifyPosition(_Symbol,Open,T_P);
          }
          if(NormalizeDouble((Bid - TR),Digits()) > SL && Open <= SL)
//если цена бид минус указаное разстояние TR = 0.0002 болше уже от новый стоп(который поменяли уже) и цена опен менше новый стоп 
//вызиваем модификация
//сама модификация - для стоп будет прошлый стоп минус стоп ниво* _Point(что б стали пипси) плюс указаное TR,цена тейк не меняем.
//Т.е. будем двигат стоп через каждые 2 пипса  
           {
            ModifyPosition(_Symbol,NormalizeDouble(((SL - L_S * _Point) + TR),Digits()),T_P);
           }
        }
      }
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
      {
      if(sel_trail > STR)
       { 
        if(NormalizeDouble((Ask + STR),Digits()) <= Open && Open < SL)
          {
           ModifyPosition(_Symbol,Open,T_P);
          }
          if(NormalizeDouble((Ask + TR),Digits()) < SL && Open >= SL)
           {
            ModifyPosition(_Symbol,NormalizeDouble(((SL +L_S * _Point)- TR),Digits()),T_P);
           }
        }
      }
     } 
//===============================================

コードには必ず何らかのアクションの条件が含まれているはずですが、すべてチェックされ、何らかのロジックを持っているはずです。

手伝いたい人は、print(" ", ); )で結果を見てください。

 
mario065:

描写はどれもわかりやすく、効果も期待できます。しかし、これは「ブレークイーブン」と「トレーリング」の修正である。注文開始後にStopLimitとTakeProfitを設定するように修正する必要がある、つまり。

1. 注文受付

--------

2.ストップリミットの設定変更 (未対応)

 if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
    {
    if(!PositionGetDouble(POSITION_SL))
      {
      PositionModify(_Symbol,NormalizeDouble((Open-STR-TR),Digits()),NormalizeDouble((Open+TP),Digits()));
      }

------

3.ブレークイーブンのための修正

4.トレーリングストップの修正

5.クローズオーダー


ポイント2を使って注文を修正することができますが、次のバーの開始時のみです。

 

eatsを開くための関数が書かれています。

Сама функция(символ,обем,проскалзивание,стоп,тейк,магик)
С вызова функции можно все сразу поставит.
bool BuyPositionOpen(const string symbol,double volume,ulong deviation,double StopLoss,double Takeprofit,int Magic)     
    if(Какое то условие)
      {
       BuyPositionOpen(_Symbol,Lot,0,NormalizeDouble(Ask - 0.003,_Digits),NormalizeDouble(Ask + 0.003,_Digits),MagicNumber);
      }
     if(Какое то условие)
      {
       SellPositionOpen(_Symbol,Lot,0,NormalizeDouble(Bid + 0.003,_Digits),NormalizeDouble(Bid - 0.003,_Digits),MagicNumber);
      }
Функция для закрития:
Сама функция(символ,проскалзивание,магик)
bool BuyPositionClose(const string symbol,ulong deviation,int Magic)
// Логика за затваряне на дългите
      if(Какое то условие){
         BuyPositionClose(_Symbol,0,MagicNumber);}                        
// Логика за затваряне на късите
      if(Какое то условие){
         SellPositionClose(_Symbol,0,MagicNumber);} 

Если не хочете сразу ставит стоп и тейк,тогда:
//=============================================== 
//Един вид извикване на модификация на отворената позиция
  double buy_trail = 0;
  double sel_trail = 0;
  double SL,T_P,Open;
  ulong L_S;
  if(PositionSelect(_Symbol)){
     Open = PositionGetDouble(POSITION_PRICE_OPEN);
     SL   = PositionGetDouble(POSITION_SL);
     T_P  = PositionGetDouble(POSITION_TP);
     Bid  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
     Ask  = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
     L_S  = SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
     buy_trail = NormalizeDouble(Bid - Open,Digits());
     sel_trail = NormalizeDouble(Open - Ask,Digits());
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
      {
if(SL = 0 && T_P = 0)//если стоп и тейк равни нулю-вызиваете модофикация и там акуратно ложите нужная вам цена
{
  ModifyPosition(_Symbol,NormalizeDouble((Open - 0.003),Digits()),NormalizeDouble((Open + 0.003),Digits()));
}
//Далше вам понятно:
      if(buy_trail > STR)
       {
        if(NormalizeDouble((Bid - STR),Digits()) >= Open && Open > SL)
          {
           ModifyPosition(_Symbol,Open,T_P);
          }
          if(NormalizeDouble((Bid - TR),Digits()) > SL && Open <= SL)
           {
            ModifyPosition(_Symbol,NormalizeDouble(((SL - L_S * _Point) + TR),Digits()),T_P);
           }
        }
      }
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
      {
      if(sel_trail > STR)
       { 
        if(NormalizeDouble((Ask + STR),Digits()) <= Open && Open < SL)
          {
           ModifyPosition(_Symbol,Open,T_P);
          }
          if(NormalizeDouble((Ask + TR),Digits()) < SL && Open >= SL)
           {
            ModifyPosition(_Symbol,NormalizeDouble(((SL +L_S * _Point)- TR),Digits()),T_P);
           }
        }
      }
     } 
//=============================================== 
 
このスレッドにMQL5開発者はいるのか!?私は間違った支店で質問しているのでしょうか?では、開発者に質問する方法を教えてください。上記の質問は、経験豊富なプログラマーにとっては初歩的なものですが...。
理由: