MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1268

 
みんな、これは私がどこにも答えを見つけることができない質問です。 それは私の条件を動作するまで、新しいバーが開いて、ゼロバーでカチカチしないようにインジケータに書き込むにはどのような関数は、プライベートで私に答えてください))
 

こんにちは。

三本松で迷っています。

extern int a =2; extern int b =3; extern int c =4; 数値abc を、ある与えられた d (例えばd=344) と比較するために a,b, c を変更するとその値が変わるように設定するにはどうすればよいでしょうか

ありがとうございました。

 
novichok2018:

こんにちは。

三本松で迷っています。

extern int a =2; extern int b =3; extern int c =4; 数値abc を、ある与えられた d (例えばd=344) と比較するために a,b, c を変更するとその値が変わるように設定するにはどうすればよいでしょうか

ありがとうございました。

x = c + b*10 + a*100

 
Сергей Таболин:

x = c + b*10 + a*100

なんてことだ!頭を悩ませています!ありがとうございました。

 
こんにちは、2020.10.03_13:33GMT+3です。MetaTrader 4の標準的なMoving Average EAをとってみました。そして、利益が出るように変え始めたのです。ストラテジーテスターで OrderProfit()関数を使って終値条件を記述しようとしたところ、Expert Advisorがその条件で取引を終了してしまった。取引を終了するところまではいかない。しかし、決算条件が正しく書けているかは疑問です。それ以外の場合はExpert Advisorが取引を終了します。私はおそらく、取引開始価格と最終価格を書くようにします。始値と終値の差が最大になり、この差が小さくなったら -- 取引を終了します。Expert Advisorのファイルを添付します。13:50 GMT+3。
ファイル:
 
Николай Никитюк:
こんにちは、2020.10.03_13:33GMT+3です。MetaTrader 4の標準的なMoving Average Expert Advisorを取りました。そして、利益が出るように変え始めたのです。ストラテジーテスターで OrderProfit()関数を使って終値条件を記述しようとしたところ、Expert Advisorがその条件で取引を終了してしまった。取引を終了するところまではいかない。しかし、決算条件が正しく書けているかは疑問です。それ以外の場合はExpert Advisorが取引を終了します。私はおそらく、取引開始価格と最終価格を書くようにします。始値と終値の差が最大になり、この差が小さくなったら -- 取引を終了します。Expert Advisorのファイルを添付します。13:50 GMT+3。
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
   //--- check order type
      // 
      if(OrderType()==OP_BUY)
        {
        /*
         if(OrderProfit()>0.0)  
           {ProfitMax=OrderProfit(); break;} // Здесь у вас прерывается цикл, если сделка в плюсе
         if(OrderProfit()>ProfitMax)
           {ProfitMax=OrderProfit(); break;}
         if((ProfitMax-DiffProfit)<0.0) break;    
         if((ProfitMax-DiffProfit)>OrderProfit())
         */
         if(DiffProfit<OrderProfit())     // Исходя из ваших условий, то вот            
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
           }  
         else break;     
         break;
        }
      if(OrderType()==OP_SELL)
        {
        /*
         if(OrderProfit()>0.0)  
           {ProfitMax=OrderProfit(); break;} // Здесь у вас прерывается цикл, если сделка в плюсе
         if(OrderProfit()>ProfitMax)
           {ProfitMax=OrderProfit(); break;}
         if((ProfitMax-DiffProfit)<0.0) break;     
         if((ProfitMax-DiffProfit)>OrderProfit())
         */
         if(DiffProfit<OrderProfit())        // Исходя из ваших условий, то вот
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
               Print("OrderClose error ",GetLastError());
           }
         else break;  
         break;
        }
     }      

//+------------------------------------------------------------------+
 

こんにちは。

入力データを正規化する関数を書き始めました。しかし、元の値を正規化した値に「置き換える」ことはできない。つまり、Open timeseries bufferの値をTemp arrayの新しい値で更新することができないのです。私のエラーは何ですか?OOPと非OOPを掛け合わせようとしている感がある))。

Open=new CiOpen();
   if(CheckPointer(Open)==POINTER_INVALID || !Open.Create(Symb.Name(),PERIOD_CURRENT))
      return;
//---
   int bars=10;
   double Temp[];                //Создаем массив для временного хранения входных данных
   ArraySetAsSeries(Temp,true);  //Устанавливает флаг AS_SERIES
   Open.GetData(0,bars,Temp);    //Копируем необходимые данные в массив Temp
   InputNormalize(Temp,bars);    //Нормализуем данные в массиве
 
//---Как заменить значения в Open значениями из Temp?---

  }
//+------------------------------------------------------------------+
//| функция нормализации входных данных                              |
//+------------------------------------------------------------------+
void InputNormalize(double &buffer[],int bars)
  {
   double d1=-1;
   double d2=1;
   double x_min=buffer[ArrayMinimum(buffer,0,bars)];
   double x_max=buffer[ArrayMaximum(buffer,0,bars)];
   for(int i=0; i<bars; i++)
     {
      buffer[i]=(((buffer[i]-x_min)*(d2-d1))/(x_max-x_min))+d1;
     }
   return;
  }

もっと簡単な方法でできるはずだ!この場合、ご教示ください)

 
Aleksei Lesnikov:

こんにちは。

入力データを正規化する関数を書き始めました。しかし、元の値を正規化した値に「置き換える」ことはできない。つまり、Temp配列の新しい値でOpenタイムズバッファーの値を更新することができないのです。私のエラーは何ですか?OOPと非OOPを掛け合わせようとしている感がある))。

もっと簡単な方法でできるはずだ!この場合、ご教示ください)

言語ドキュメントを読む

定義済み変数の値は、mql4-programの実行を開始する前に、クライアント端末によって設定される。定義済みの変数は一定で、mql4-programから変更 することはできません。


Предопределенные переменные - Справочник MQL4
Предопределенные переменные - Справочник MQL4
  • docs.mql4.com
Для каждой выполняющейся mql4-программы поддерживается ряд предопределенных переменных, которые отражают состояние текущего ценового графика на момент запуска программы - эксперта, скрипта или пользовательского индикатора. Значение предопределенным переменным устанавливает клиентский терминал перед запуском mql4-программы на выполнение...
 
Alexey Viktorov:

言語ドキュメントを読む

アレクセイ、ありがとう!これで 不可能であることが明らかになった。

確かに、私はmql4とはちょっと違いますね。CiOpenクラスで データを変更しようとしています。Updateメソッドで、配列の指定した位置の要素を変更する必要があるのですが、混乱しています。

Документация по MQL5: Стандартная библиотека / Индикаторы / Таймсерии / CiOpen
Документация по MQL5: Стандартная библиотека / Индикаторы / Таймсерии / CiOpen
  • www.mql5.com
CiOpen - Таймсерии - Индикаторы - Стандартная библиотека - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Aleksei Lesnikov:

アレクセイ、ありがとう!これで 無理が明らかになった。

たしかに、正確にはmql4は持っていませんね。CiOpenクラスで データを変更しようとしています。Updateメソッドで、配列の指定した位置の要素を変更する必要があるのですが、混乱しています。

mql4のコーナーで質問されているので、mql4について回答しました。ご質問の中に、mql5へのヒントがありません。しかし、結果は同じです。