Программисты помогите разобраться!!!

 

Приветствую всех.


Во многих ветках данного форума, многие пишут о том, что свои функции пишите во внешней DLL и проблем потери кода будет намного меньше.

Так вот меня все таки захлестнул интерес, как написать во внешней DLL свою функцию, как правильно подключить её к эксперту, как протестировать на корректность её работы.


Если кто понимает в этом деле помогите разобраться...


Для примера взял код из первого поста ветки KimIV.


//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание : Установка ордера. Версия функции для тестов на истории.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    pp - цена                                                               |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - Magic Number                                                       |
//|    ex - Срок истечения                                                     |
//+----------------------------------------------------------------------------+
void SetOrder(string sy, int op, double ll, double pp,
              double sl=0, double tp=0, int mn=0, datetime ex=0) {
  color clOpen;
  int   err, ticket;
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell;
  ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, "", mn, ex, clOpen);
  if (ticket<0) {
    err=GetLastError();
    Print("Error(",err,") set ",GetNameOP(op),": ",ErrorDescription(err));
    Print("Ask=",Ask," Bid=",Bid," sy=",sy," ll=",ll,
          " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
  }
}
//+----------------------------------------------------------------------------+


Подскажите как на данном несложном примере перевести функцию во внешнюю DLL.

Языки программирования на которых публикуете пример тоже пишите.

 
вопрос правильный, но предлагаемое автором ветки действо - включить в DLL то что принадлежит MQL-4
несколько/весьма прискорбно(((
 
Korey писал(а) >>
вопрос правильный, но предлагаемое автором ветки действо - включить в DLL то что принадлежит MQL-4
несколько/весьма прискорбно(((

Ага...

Торговые переменные проще и удобнее оставить на откуп MQL (иначе придется это реализовать посредством не самого полного кустарного API), в ДЛЛ надо перенесить расчетную часть, условия принятия решений и т.д.

HIDDEN, лучше выбрать какой-нибудь другой пример...

 
Действительно было бы любопытно посмотреть как подключить внешнюю библиотеку. Замучился с MetaTrader'ом. Тормозит и уже несколько раз заметил неправильное исполнение команд. Вероятно код исполняемый во внешней библиотеке будут быстрее.
 
Korey >>:
вопрос правильный, но предлагаемое автором ветки действо - включить в DLL то что принадлежит MQL-4
несколько/весьма прискорбно(((

Нет я не предлагаю весь MQL4 перенести в DLL. Я лишь хочу разобраться с моментом переноса части кода. Для примера привел код из MQL4, как спасти кусок от злосного декомпила? Перенести функцию в DLL. А вот как это правильно сделать и есть суть моего вопроса.

 
Figar0 >>:

Ага...

Торговые переменные проще и удобнее оставить на откуп MQL (иначе придется это реализовать посредством не самого полного кустарного API), в ДЛЛ надо перенесить расчетную часть, условия принятия решений и т.д.

HIDDEN, лучше выбрать какой-нибудь другой пример...

Хорошо допустим вот из последнего в Code Base индикатор NonLagAMA. Допустим правила торговли мы оставляем штатно в MQL4. Сам индикатор перенесем в DLL и подключив DLL к эксперту научим торговать его по сигналам. Как сделать эту связку? Хотя до момента реализации нужно разобраться, что кроме расчётов можно переносить в DLL, а что совсем необезательно.

 

)

 
OrderSend не переносится в DLL,
причны: у MQL-4 бесплатного распространения нет компиляции собственных DLL,
и также не известен API MQL-4 торговых функций
Если хотите уйти - посмотрите эту платформу
http://www.brocompany.com/trading-platform/srb/
 
Korey >>:
OrderSend не переносится в DLL,
причны: у MQL-4 бесплатного распространения нет компиляции собственных DLL,
и также не известен API MQL-4 торговых функций
Если хотите уйти - посмотрите эту платформу
http://www.brocompany.com/trading-platform/srb/

Не уходить не собираюсь, еще с MT4 не полностью разобрался, хотя душа рвется переодически за пределы....

 

Простой учебный пример индикатора с длл на фортране:

//+------------------------------------------------------------------+
//|                                              !__Ind_PWMA_DLL.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
//
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//
#import "MT4_DLL.dll"
 double GetPWMAOnArray(int reset, int n_pol, int range, double& x0[]);
#import
//---- input parameters
extern int N_Pol =  0;
extern int Range = 14;
//---- arrays
double X0_Inp[]; 
//---- buffers
double PWMA_Buffer[]; 
// 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
// 
int init()
 {  
  ArrayResize(X0_Inp, Range); 
  ArrayInitialize(X0_Inp, 0); 
 //---- indicators
  SetIndexBuffer(0, PWMA_Buffer); 
  SetIndexStyle(0, DRAW_LINE); 
  SetIndexDrawBegin(0, Range); 
  // 
  GetPWMAOnArray(1, N_Pol, Range, X0_Inp); 
 //----
  return(0);
 } 
//
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
// 
int deinit()
 {
 //----
  GetPWMAOnArray(1, N_Pol, Range, X0_Inp);  
 //----
  return(0);
 }
// 
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
// 
int start()
 { 
  static int k = 0; 
  // 
  int counted_bars = IndicatorCounted(); 
  int limit = Bars - counted_bars; 
  int i, j; 
 //----
  for (i = limit - 1; i >= 0; i--) 
   { 
    if (k < Range) 
     { 
      for (j = Range - 2; j >= 0; j--) { X0_Inp[j + 1] = X0_Inp[j]; } 
      X0_Inp[0] = Close[i]; 
      // 
      k++; 
     } 
    else 
     { 
      for (j = Range - 1; j >= 0; j--) { X0_Inp[j] = Close[i + j]; } 
     } 
    //  
    PWMA_Buffer[i] = GetPWMAOnArray(1, N_Pol, Range, X0_Inp); 
   }
 //----
  return(0);
 } 
/*
!
!************************* FORTRAN 90 :: MT4_DLL.f90 ************************
!************************* FORTRAN POWER STATION 4.0 ************************
!************************* FORTRAN MULTITHREADED DLL ************************
!
!ms$freeform
!ms$declare
!
!+--------------------------------------------------------------------------+
!| Степенно-взвешенная скользящая средняя по массиву x0[]                   |
!+--------------------------------------------------------------------------+
!
real*8 function GetPWMAOnArray ( reset, n_pol, range, x0 )
!
!ms$if .not. defined ( LINKDIRECT )
  !ms$attributes     alias : 'GetPWMAOnArray' :: GetPWMAOnArray
  !ms$attributes     value :: reset, n_pol, range
  !ms$attributes reference :: x0 
  !ms$attributes dllexport :: GetPWMAOnArray
!ms$endif
!
implicit none
  !
  integer*4 :: reset, n_pol, range, i
  real*8    :: x0(0 : range)
  !
  logical*4, static :: run_once = .false.
  integer*4, static :: wgt [allocatable] (:)
  real*8   , static :: w_sum = 0
  real*8 :: pwma
  !
  if ((n_pol < 0) .or. (range < 1)) then
    GetPWMAOnArray = 0.0
    return
  end if
  !
  if (reset == 1) then
    run_once = .false.
    if (allocated(wgt)) deallocate(wgt)
    GetPWMAOnArray = 0.0
    !return  
  end if
  !
  if (.not. (run_once)) then
    if (.not. (allocated(wgt))) allocate(wgt(0 : range))
    !
    w_sum = 0.0
    do i = range - 1, 0, -1 
     wgt(i) = (range - i) ** n_pol 
     w_sum = w_sum + dfloat(wgt(i)) 
    end do
    !
    run_once = .true.
  end if 
  !
  pwma = 0.0
  do i = range - 1, 0, -1
    pwma = pwma + wgt(i) * x0(i)
  end do
  GetPWMAOnArray = pwma / w_sum      
!
end function GetPWMAOnArray 
*/
//+------------------------------------------------------------------+
 
alexjou >>:

Простой учебный пример индикатора с длл на фортране:

На фортране чё-то не сруки. Слышал только о таком языке программирования, вижу впервые.

Причина обращения: