MQL5におけるOOPに関する質問 - ページ 60

 
Igor Makanu:

おはこんばんちわ


この質問は、enumがあり、我々は配列enumまたはリストenumまたはコンテナenumのいずれかが必要です - 7 enumを格納する何か、しかし食欲は、おそらく70 enumを成長させる。


どこ

配列とリストとコンテナの両方が、タスクによって可能です。私の理解では、おそらくコードを書くのを単純化する必要があり、その場合、列挙型をグループに分割し、各オブジェクトのパラメータ用の構造体に結合することができます。

実行段階の話であれば、値・ペアを指定するときだけenumを使うのが普通だと思います。そして、それらを格納するために、単純なベースタイプを使用します。

 
Aleksey Mavrin:

タスクに応じて、配列、リスト、コンテナを作ることができます。私の理解では、おそらくコードを書くのを単純化する必要があり、そうすれば、列挙型をグループに分け、各オブジェクトのパラメータ用の構造体にまとめることができます。

実行段階の話であれば、値・ペアを指定するときだけenumを使うのが普通だと思います。そして、それらを格納するために、単純なベースタイプを使用します。

最初はそうだったのですが、あるビルドでそのようなフィールドの初期化というか、MEのenumのオートコンプリートバリアントに問題があったようで、おそらく別のインジェクタのコードの一部が...ということが原因だったようです。この選択肢を検討してみましょう。


ネットで調べると、こんなシャープなのが欲しい...。いくつかのプロパティ(((。

 public class COrder
    {
        public enum E_MOTION { HIGHER, LOWER, ZIGZAG }
        public enum E_VOLUME { FIXED, INC, DEC }
        public E_MOTION OrderMotionType { get; set; }
        public E_VOLUME OrderVolumeType { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var current = new COrder { OrderMotionType = COrder.E_MOTION.HIGHER, OrderVolumeType = COrder.E_VOLUME.FIXED };
            
        }
    }
 
Igor Makanu:

このようなフィールドの初期化というか、MEでのenumバリアントのオートコンプリートに問題があったようで、おそらく別のインジェクタのコードの一部が...でした。この選択肢を検討してみましょう。


ネットで調べると、こんなシャープなのが欲しい...。何らかのプロパティーがある((

何が問題なのか?

一対一なら。

class COrder
{
public:
   enum E_MOTION { HIGHER, LOWER, ZIGZAG };
   enum E_VOLUME { FIXED, INC, DEC };
   E_MOTION orderMotionType;
   E_VOLUME orderVolumeType;
   COrder(E_MOTION _motion, E_VOLUME _volume):orderMotionType(_motion),orderVolumeType(_volume){}
};

void OnStart(){
   COrder* current = new COrder(COrder::HIGHER,COrder::FIXED);
 } 

これは、列挙をグローバルスコープに 置きたくない場合です。

 
Vladimir Simakov:

これは、グローバルスコープに 列挙を置きたくない場合です。

ふむ

ただ、その方法がわからなかったのです。

 COrder* current = new COrder(COrder::HIGHER,COrder::FIXED);

ありがとうございます。

 

シンプルなオブジェクトをJSONにアップ ロードするためのエレガントなソリューションを持って いる人はいますか?

MQLのこのようなコードの例が必要です。

public class COrder
    {
        public enum E_MOTION { HIGHER, LOWER, ZIGZAG }
        public enum E_VOLUME { FIXED, INC, DEC }

        public bool IsRunning { get; set; }
        public int OpenPrice { get; set; }
        public int ClosePrice { get; set; }
        public E_VOLUME OrderVolumeType { get; set; }
        public E_MOTION OrderMotionType { get; set; }
        
    }

    class Program
    {
        static void Main(string[] args)
        {
            var current = new COrder {
                IsRunning = false, 
                OpenPrice = 1200,
                ClosePrice = 1300,
                OrderMotionType = COrder.E_MOTION.ZIGZAG, 
                OrderVolumeType = COrder.E_VOLUME.FIXED };

            string json = JsonSerializer.Serialize<COrder>(current);
            Console.WriteLine(json);
            Console.ReadLine();
        }
    }

{"IsRunning":false,"OpenPrice":1200,"ClosePrice":1300,"OrderVolumeType":0,"OrderMotionType":2}

MQLシリアライザーがhttps://www.mql5.com/ru/code/13663 で 利用可能

が、正しいフィールドトラバーサルの構造を理解していない

 
Igor Makanu:

しかし、オブジェクトのフィールドを適切にトラバースする方法がわからない

マクロが全てです)
 
Alexey Navoykov:
マクロがすべて!)

うんうん...もう一度聞いてみます。

試験官を助けてください!お願いします

 
Igor Makanu:

うんうん...もう一度聞いてみます。

助けて!例題が欲しい! お願いします。

まあ、具体的にフィールドを迂回するという質問であれば、こんな感じでしょうか。

#define SERIALIZE5(object, m1, m2, m3, m4, m5)  /* your code */

...

SERIALIZE5(current, IsRunning, OpenPrice, ClosePrice, OrderVolumeType, OrderMotionType);

そして、マクロの本体は自分で鍛えることができる)

 
Alexey Navoykov:

まあ、フィールドトラバーサルに関する質問であれば、だいたいこんな感じでしょうか。

そして、マクロの本体は自分で鍛えることができる)

なるほど、そういうことだったのか!

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

 
一方、シリアライゼーションでは、フィールドのテキスト名を明示的に指定した方がよいでしょう。そうすれば、保存したファイルが動作しなくなることを心配せずに、後でコードの中でフィールド名を変更することができます。