Обсуждение статьи "Создание графических интерфейсов для экспертов и индикаторов на базе .Net Framework и C#" - страница 10

 
Потрясающе! Работает как шарм. Большое спасибо!
 
Можно ли использовать эту библиотеку в MT4?
 
Можем ли мы прикрепить это приложение .Net к диаграмме?
 

Для MT4 нам нужно внести некоторые изменения в MtGuiController.dll, например, DLLEXPORT с помощью RGiesecke.DllExport и маршаллинг входных и выходных параметров.

 // add reference using nuget 
using RGiesecke.DllExport;

        [DllExport("ShowForm", CallingConvention = CallingConvention.StdCall)]
        public static void ShowForm([MarshalAs(UnmanagedType.LPWStr)] string assembly_path, [MarshalAs(UnmanagedType.LPWStr)] string form_name)
        {
            try
            {
                GuiController controller = GetGuiController(assembly_path, form_name);
                string full_path = assembly_path + "/" + form_name;
                m_controllers.Add(full_path, controller);
                controller.RunForm();
            }
            catch(ArgumentException e)
            {
                Type t = e.GetType();
                SendExceptionEvent(e);
            }
        }
        [DllExport("HideForm", CallingConvention = CallingConvention.StdCall)]
        public static void HideForm([MarshalAs(UnmanagedType.LPWStr)] string assembly_path, [MarshalAs(UnmanagedType.LPWStr)] string form_name)
        {
            try
            {
                string full_path = assembly_path + "/" + form_name;
                if (!m_controllers.ContainsKey(full_path))
                    return;
                GuiController controller = m_controllers[full_path];
                controller.DisposeForm();
                m_controllers.Remove(full_path);
            }
            catch(Exception ex)
            {
                SendExceptionEvent(ex);
            }
        }
        [DllExport("SendEvent", CallingConvention = CallingConvention.StdCall)]
        public static void SendEvent([MarshalAs(UnmanagedType.LPWStr)] string el_name, [MarshalAs(UnmanagedType.U4)] int id, [MarshalAs(UnmanagedType.U8)] long lparam, [MarshalAs(UnmanagedType.R8)] double dparam, [MarshalAs(UnmanagedType.LPWStr)] string sparam)
        {            
            SendEventRef(el_name, ref id, ref lparam, ref dparam, sparam);
        }
        [DllExport("ReceiveEvent", CallingConvention = CallingConvention.StdCall)]
        [return: MarshalAs(UnmanagedType.LPWStr)]
        public static string ReceiveEvent([MarshalAs(UnmanagedType.I4)] int event_n)
        {
            string json = "";
            int id=0;
            string el_name="", sparam="";
            long lparam=0;
            double dparam=0.0;
            GetEvent(event_n,ref el_name, ref id, ref lparam, ref dparam, ref sparam);
            json = "{ \"el_name\":\"" + el_name + "\",\"id\":" + id + ",\"lparam\":" + lparam + ",\"dparam\":" + dparam + ",\"sparam\":\"" + sparam + "\" }"; 
            return json;
        }
        public static void GetEvent(int event_n, ref string el_name,ref int id,  ref long lparam, ref double dparam, ref string sparam)
        {         
                GuiEvent e = m_global_events[event_n];
                el_name = e.el_name;
                id = (int)e.id;
                lparam = e.lparam;
                dparam = e.dparam;
                sparam = e.sparam;
            
        }
       
        [DllExport("EventsTotal", CallingConvention = CallingConvention.StdCall)]
        public static int EventsTotal()
        {
            return m_global_events.Count;
        }
      


MQL4


#import  "MtGuiController.dll"
void ShowForm(string assembly_path, string form_name);
void HideForm(string assembly_path, string form_name);
void SendEvent(string el_name, int id, long lparam, double dparam, string sparam);
string ReceiveEvent(int event_n); // Returns JSON string.. Use JAson.mqh to Deserialize objects
int EventsTotal();
#import
 

Я относительный новичок в MQL5 и многое узнал из этой статьи! Спасибо большое!


У меня есть один вопрос. Последние 2 дня я не могу разобраться с тем, что написано ниже.


Я успешно выполнил каждый шаг несколько раз, даже на другом компьютере, но каждый раз, когда я пытаюсь скомпилировать код, я получаю сообщение об ошибке.


Компилятор MQL заявляет: "Undeclared Identifier" для любого из перечислений ниже.


public enum GuiEventType
{
    Exception,
    ClickOnElement,
    TextChange,
    ScrollChange
}

Если я "закомментирую" эти перечисления из MQL5, то все будет работать, что интересно, так как это означает, что код работает, но не может прочитать перечисления, что я и предполагаю?

Если кто-то сможет мне помочь, я буду очень признателен :)


Спасибо,

 

Я также пытаюсь импортировать сборку C#. Я могу успешно компилировать, даже с вызовом метода, импортированного из сборки, так что во время компиляции все вроде бы в порядке.

Но во время выполнения в тестере стратегий советник не загружается с простым сообщением "Cannot load 'MyDll.dll' [0]".

Я поместил DLL в MQL5\Libraries. Я также пробовал поместить ее в GAC, но ничего не помогло.

Подскажите, как устранить неполадки?

 
dhilgarth:

Я также пытаюсь импортировать сборку C#. Я могу успешно компилировать, даже с вызовом метода, импортированного из сборки, так что во время компиляции все кажется в порядке.

Но во время выполнения в тестере стратегий советник не загружается с простым сообщением "Cannot load 'MyDll.dll' [0]".

Я поместил DLL в MQL5\Libraries. Я также пробовал поместить ее в GAC, но ничего не помогло.

Подскажите, как устранить неполадки?

Вызовите ссылку MQL в редакторе (в "Справке"), перейдите на вкладку "Поиск" и введите Dll, Enter.

Там есть страница о том, как импортировать dll (и другие).

Однако эта статья, вероятно, лучше: https://www.mql5.com/ru/articles/18.

или вот эта: https://www.mql5.com/ru/docs/runtime/testing#dll.

В противном случае введите tester dll в поиск в правом верхнем углу.
Datenaustausch: Erstellen einer DLL für MQL5 in 10 Minuten
Datenaustausch: Erstellen einer DLL für MQL5 in 10 Minuten
  • www.mql5.com
Tatsächlich erinnern sich nicht viele Entwickler daran, wie eine simple DLL-Bibliothek geschrieben wird und was die Merkmale der unterschiedlichen Systemanbindungen sind. Anhand mehrerer Beispiele werde ich versuchen, Ihnen den gesamten Prozess zur Erstellung einer simplen DLL in 10 Minuten zu zeigen, sowie einige technische Einzelheiten der...
 

смог ли кто-нибудь выяснить, почему возникает следующая ошибка?

Компилятор MQL выдает ошибку : "Undeclared Identifier" для любого из перечислений ниже.

Я также получаю ту же ошибку.

 
С элементами управления гораздо проще разрабатывать на C# по сравнению с разработкой EA, а расчеты данных и т.д. были улучшены, спасибо за то, что поделились.
 
sachnyc:

Кто-нибудь смог выяснить, почему возникает ошибка ниже?

Компилятор MQL выдает ошибку : "Undeclared Identifier" для любого из перечислений ниже.

Я также получаю ту же ошибку.

Вы можете использовать числовое представление каждого типа события:

Тип события ID
Исключение 0
ClickOnElement 1
TextChange 2
ScrollChange 3

Вот пример с функцией SendEvent (этот код взят из советника TardePanel):

GuiController::SendEvent("CurrentVolume", TextChange, 0, 0.0, corr_vol);
GuiController::SendEvent("CurrentVolume", 2, 0, 0.0, corr_vol);

Вы меняете представление события TextChange на его ID, который равен 2, и делаете это для всех функций, которым это необходимо.