Discussão do artigo "Expondo código C# para MQL5 usando exportações não gerenciadas"

 

Novo artigo Expondo código C# para MQL5 usando exportações não gerenciadas foi publicado:

Neste artigo eu apresentei diferentes métodos de interação entre o código MQL5 e o código C# gerenciado. Eu também ofereci vários exemplos de como organizar estruturas MQL5 contra C# e como invocar funções de DLL exporta em scripts MQL5. Eu acredito que forneci exemplos que podem servir como uma base para pesquisas futuras sobre escrever DLLs em código gerenciado. Este artigo também abre portas para o MetaTrader usar muitas bibliotecas que já estão implementadas em C#.

Figura 2. Modelo de interoperabilidade COM

Autor: investeo

 
Artigo muito útil! Obrigado pela apresentação detalhada.
 
Academic:

Artigo muito útil! Obrigado pela apresentação detalhada.

Sim, obrigado.

Eh, o Metaquotes tentou melhorar o desempenho, para se afastar do byte-code... e ainda assim colocamos todos os programas nele! )))

Pergunta para o autor: foram realizados testes comparativos do tempo de execução de programas MQL5 puros, DLLs e monstros .NET? Seria interessante dar uma olhada neles.

[Excluído]  
alsu:

Sim, obrigado.

Eh, o Metaquotes tentou melhorar o desempenho, para fugir do byte-code... e ainda vamos colocar todos os programas nele! )))

Pergunta para o autor: foram realizados testes comparativos do tempo de execução de programas MQL5 puros, DLLs e monstros .NET? Seria interessante dar uma olhada neles.

Eu me juntei à pergunta. Estou interessado no tempo de execução de MQL, VB.NET (gerenciado), C++ (gerenciado/não gerenciado), C# (gerenciado/não gerenciado). E outra pergunta para todos. Onde (exceto no VB - é possível lá) é possível usar matrizes dinâmicas para transferir o código do MQL5 para um programa ou DLL mais rápido sem modificações. No VB, tudo é quase idêntico ao MQL (operadores para trabalhar com matrizes dinâmicas), mas quais linguagens também têm tudo o que é necessário?
 
Olá,
Acho que
, em princípio, é muito útil abrir possíveis recursos e achei este artigo muito interessante. Mas não sou um programador muito experiente e , portanto,tenho algumas dúvidas.

Do meu ponto de vista, o código não gerenciado me dá a possibilidade de desenvolver uma plataforma independente. Mas se alguém usar o Metatrader, ele terá uma plataforma definida.

Qual é o benefício do código não gerenciado em geral e em combinação com MQL5 ? - Por favor, corrija-me se eu tiver entendido algo errado!


 
smartwart:
Olá,
Acho que
, em princípio, é muito útil abrir possíveis recursos e achei este artigo muito interessante. Mas não sou um programador muito experiente e , portanto,tenho algumas dúvidas.

Do meu ponto de vista, o código não gerenciado me dá a possibilidade de desenvolver uma plataforma independente. Mas se alguém usar o Metatrader, ele terá uma plataforma definida.

Qual é a vantagem do código não gerenciado em geral e em combinação com MQL5 ? - Por favor, corrija-me se eu tiver entendido algo errado!


Oi smartwart,

A vantagem é que há uma grande quantidade de código já desenvolvido em C# que você pode usar para fins de negociação. Você lerá mais em meu próximo artigo.

Parabéns,

Investeo

 

Essa é a melhor coisa de todas! Eu adoro C# e estava procurando qualquer possibilidade de fazê-lo funcionar! A melhor notícia do ano! Acho que essa foi a última vez que escrevi um EA em MQL5. Colocarei toda a lógica em bibliotecas e usarei um modelo EA.mq5 para todos os meus EAs (apenas eles serão vinculados a diferentes bibliotecas).

Muito obrigado!

 
alsu:

Sim, obrigado.

Eh, o Metaquotes tentou melhorar o desempenho, para fugir do byte-code... e ainda vamos colocar todos os programas nele! )))

Pergunta para o autor: foram realizados testes comparativos do tempo de execução de programas MQL5 puros, DLLs e monstros .NET? Seria interessante dar uma olhada neles.

De que bytecode eles se livraram? Eles o tinham em 4? Havia apenas um compilador lento, sem otimização.

No .NET, não há bytecode; na inicialização, tudo é compilado em código de máquina nativo, com otimização para um processador específico. Se o tempo para a primeira compilação for crítico, use o ngen http://msdn.microsoft.com/ru-ru/library/6t9t5wcf.aspx.

E testes, sim... seria interessante

Pessoalmente, uso apenas dois dos métodos descritos, só ouvi falar dos outros. Não entendi como o COM-interop pode ajudar, mas isso provavelmente é para completar o quadro. O artigo é 5.

Ngen.exe (генератор образов в машинном коде)
Ngen.exe (генератор образов в машинном коде)
  • msdn.microsoft.com
Внимание Единственный сценарий, в котором необходимо устанавливать зависимость отдельно — это загрузка зависимости приложением с помощью отражения, например путем вызова метода . Важно Примечание Формирование образов для различных сценариев Например, при выполнении сборки в рамках...
 
VDev:

De que tipo de código de bytes eles estavam fugindo? Eles o tinham em 4? Havia apenas um compilador lento sem otimização.

A MQL4 tinha bytecode, enquanto a MQL5 é compilada em bytecode com pré-compilação subsequente em x86 ou x64 nativo antes da execução. A MQL5 se comporta como o .NET

A MQL5 como linguagem será mais desenvolvida (os desenvolvedores exigem mais funcionalidade e melhor compatibilidade com o C++), e seu otimizador será aprimorado.

Nas versões mais recentes, agora é possível incluir recursos (.BMP e .WAV) diretamente nos arquivos EX5 por meio de #resource, o que permite criar aplicativos autossuficientes. Essa é uma boa base para o desenvolvimento e a venda de aplicativos completos para a plataforma MetaTrader 5. A versão beta do Mercado MQL5 será lançada em breve, onde qualquer desenvolvedor poderá vender seus aplicativos (após rigorosa moderação), e todos os traders terão acesso direto a essa loja.

 

Sou o único que não consegue compilar modelos para exportação não gerenciada para o VS C#?

Peguei o modelo do artigo (não está completo, falta a dll) e o complementei com as bibliotecas de R. Giesecke obtidas aqui . As bibliotecas de Giesecke foram obtidas aqui http://sites.google.com/site/robertgiesecke/Home/uploads,

pegou o modelo original de R. Giesecke, também fiz uma mistura dos dois modelos, mas não saiu nada.

Ao compilar o modelo original, o compilador apresenta o seguinte:

------ Построение начато: проект: UnmanagedExportLibrary8, Конфигурация: Debug Any CPU ------
Построение начато 15.03.2011 19:02:04.
CoreCompile:
  C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe /noconfig /nowarn:1701,1702 /nostdlib+ /errorreport:prompt /define:DEBUG;TRACE /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll" /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /debug+ /debug:full /out:obj\Debug\UnmanagedExportLibrary8.dll /target:library DllExport\DllExportAttribute.cs UnmanagedExports.cs Properties\AssemblyInfo.cs
CopyFilesToOutputDirectory:
  Копирование файла из "obj\Debug\UnmanagedExportLibrary8.dll" в "bin\Debug\UnmanagedExportLibrary8.dll".
  UnmanagedExportLibrary8 -> d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\bin\Debug\UnmanagedExportLibrary8.dll
  Копирование файла из "obj\Debug\UnmanagedExportLibrary8.pdb" в "bin\Debug\UnmanagedExportLibrary8.pdb".
AfterBuild:
  ILDasm: calling 'C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\ildasm.exe' with /quoteallnames /unicode /nobar /linenum "/out:c:\Temp\tmpF417\UnmanagedExportLibrary8.il" "d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\bin\Debug\UnmanagedExportLibrary8.dll"
  ILDasm: ildasm 'C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\ildasm.exe' returned gracefully.
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\bin\Debug\UnmanagedExportLibrary8.dll : Export warning EXP0009: Platform is AnyCpu, creating binaries for each CPU platform in a separate subfolder...
  ILAsm: Found method: UnmanagedExportLibrary8.UnmanagedExports..method private hidebysig static float64 'AddDays'(float64 'dateValue', int32 'days') cil managed
  ILAsm: Removing RGiesecke.DllExport.DllExportAttribute from UnmanagedExportLibrary8.UnmanagedExports.AddDays
  ILAsm: Parsing 242 lines of IL took 66 ms.
  ILAsm: calling 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\ILAsm.exe' with /nologo "/out:d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\bin\Debug\x86\UnmanagedExportLibrary8.dll" "c:\Temp\tmpF417\UnmanagedExportLibrary8.x86.il" /DLL "/resource=c:\Temp\tmpF417\UnmanagedExportLibrary8.res"  /debug  
  ILAsm: ILAsm 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\ILAsm.exe' returned gracefully.
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : 
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembling 'c:\Temp\tmpF417\UnmanagedExportLibrary8.x86.il'  to DLL --> 'd:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\bin\Debug\x86\UnmanagedExportLibrary8.dll'
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Source file is UNICODE
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : 
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::.ctor
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::.ctor
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::.ctor
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::get_CallingConvention
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::set_CallingConvention
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::get_ExportName
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : Assembled method RGiesecke.DllExport.DllExportAttribute::set_ExportName
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : 
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : ***** FAILURE ***** 
d:\Programming\Visual Studio 2010\Projects\UnmanagedExportLibrary8\UnmanagedExportLibrary8\DllExport\RGiesecke.DllExport.targets(8,5): error : 
     в RGiesecke.DllExport.Parsing.IlParser.RunILTool(String installPath, String toolFileName, String requiredPaths, String workingDirectory, String settingsName, String arguments, String toolLoggingCode, String verboseLoggingCode, DllExportNotifier notifier, Int32 timeout)
     в RGiesecke.DllExport.Parsing.ILAsm.RunCore(CpuPlatform cpu, String fileName, String ressourceParam, String ilSuffix)
     в RGiesecke.DllExport.Parsing.ILAsm.Run(String outputFile, String ilSuffix, CpuPlatform cpu)
     в RGiesecke.DllExport.Parsing.ILAsm.ReassembleFile(String outputFile, String ilSuffix, CpuPlatform cpu)
     в RGiesecke.DllExport.DllExportWeaver.RunILAsm(ILAsm ilAsm)
     в RGiesecke.DllExport.DllExportWeaver.Run()
     в RGiesecke.DllExport.MSBuild.DllExportTask.Execute()

СБОЙ построения.

Затраченное время: 00:00:01.85
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

Ao compilar outros modelos, o resultado é praticamente o mesmo.

Sistema: W7 x64 SP1 Home Prem Lic.

IDE: VS 2010.

O Google não ajuda (.

Criei a dll do projeto manualmente e a complementei de acordo com as recomendações de R. Giesecke. Giesecke, mas também não obtive resultado.

Por favor, me ajude com conselhos.

Robert Giesecke
  • sites.google.com
Deployed as nuget package!no longer limited to C#!VS 2008 is no longer supported (it has no nuget support)Various fixes regarding path reslution for ildasm.exe, ilasm.exe and lib.exeexport names are escaped, so using il keywords like add won't be a problem any moreThe task will only execute when you have selected a specific CPU target (x86...
 
kPVT:

Eu não compilei um modelo para a exportação não gerenciada para o VS C #?

Peguei um modelo do artigo (não está completo, não está faltando dll) e adicionei às bibliotecas do R. Giesecke, retirado aqui http://sites.google.com/site/robertgiesecke/Home/uploads ,

Peguei o modelo original de R. Giesecke, assim como fiz uma mistura dos dois modelos, mas não funcionou.

Ao compilar o modelo original, o compilador gera o seguinte:

Ao compilar outros padrões, aproximadamente o mesmo.

Sistema: W7 x64 SP1 Home Prem Lic.

IDE: VS 2010.

O Google não ajuda (.

Dll cria manualmente um projeto e o complementa de acordo com as recomendações de R. Giesecke, o resultado também não está disponível.

Ajuda com conselhos.

Oi kPVT,

Existe algo no modo de compatibilidade retroativa Windows7 - XP e Win7? Se a dll funcionar no modo de 32 bits, isso significa que ela precisa ser recompilada para 64 bits para funcionar.

Tentarei perguntar ao próprio RGiesecke no stackoverflow.com.

Com os melhores cumprimentos,

Investeo