Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 342

 

İşte projenin .cpp dosyası , bir bakacağım ve birkaç kez Google ve Yandex'e gideceğim, beynimi bulandıran bir şey bulamadım, genel olarak anlaşılabilir. Hatta basit görünüyor.

 //+------------------------------------------------------------------+
//| Sample DLL for MQL4 |
//| Copyright 2001-2012, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
//---
#define MT4_EXPFUNC __declspec(dllexport) //это что?
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
#pragma pack(push, 1 )
struct RateInfo // Структура, переменные
{
unsigned int ctm;
double open;
double low;
double high;
double close;
double vol;
};
#pragma pack(pop)
//---
struct MqlStr
{
int len;
char * string // Указатель на стринг, я плохо помню.
};
static int CompareMqlStr( const void *left, const void *right);
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) //функция 
{
//---
switch (ul_reason_for_call) // оператор что делать
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH: //что это всюду, не понял.
break ;
}
//---
return (TRUE);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
MT4_EXPFUNC int __stdcall GetIntValue( const int ipar) // __stdcall кладет аргументы в стек справа налево
{ // MT4_EXPFUNC говорит что функция будет видима из метатрайдера, я не совсем понял.
printf ( "GetIntValue takes %d\n" ,ipar);
return (ipar);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
MT4_EXPFUNC double __stdcall GetDoubleValue( const double dpar)
{
printf ( "GetDoubleValue takes %.8lf\n" ,dpar);
return (dpar);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
MT4_EXPFUNC char * __stdcall GetStringValue( char *spar)
{
printf ( "GetDoubleValue takes \"%s\"\n" ,spar);
return (spar);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
MT4_EXPFUNC double __stdcall GetArrayItemValue( const double *arr, const int arraysize, const int nitem)
{
//---
if (arr== NULL )
{
printf ( "GetArrayItemValue: NULL array\n" );
return ( 0.0 );
}
if (arraysize<= 0 )
{
printf ( "GetArrayItemValue: wrong arraysize (%d)\n" , arraysize);
return ( 0.0 );
}
if (nitem< 0 || nitem>=arraysize)
{
printf ( "GetArrayItemValue: wrong item number (%d)\n" , nitem);
return ( 0.0 );
}
//---
return (arr[nitem]);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
MT4_EXPFUNC BOOL __stdcall SetArrayItemValue( double *arr, const int arraysize, const int nitem, const double value)
{
//---
if (arr== NULL )
{
printf ( "GetArrayItemValue: NULL array\n" );
return (FALSE);
}
if (arraysize<= 0 )
{
printf ( "GetArrayItemValue: wrong arraysize (%d)\n" , arraysize);
return (FALSE);
}
if (nitem< 0 || nitem>=arraysize)
{
printf ( "GetArrayItemValue: wrong item number (%d)\n" , nitem);
return (FALSE);
}
//---
arr[nitem]=value;
return (TRUE);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
MT4_EXPFUNC double __stdcall GetRatesItemValue( const RateInfo* rates, const int rates_total, const int shift, const int nrate)
{
//---
if (rates== NULL )
{
printf ( "GetRatesItemValue: NULL array\n" );
return ( 0.0 );
}
//---
if (rates_total< 0 )
{
printf ( "GetRatesItemValue: wrong rates_total number (%d)\n" , rates_total);
return ( 0.0 );
}
//---
if (shift< 0 || shift>=rates_total)
{
printf ( "GetRatesItemValue: wrong shift number (%d)\n" , shift);
return ( 0.0 );
}
//---
if (nrate< 0 || nrate> 5 )
{
printf ( "GetRatesItemValue: wrong rate index (%d)\n" , nrate);
return ( 0.0 );
}
//---
int nitem=rates_total- 1 -shift;
switch (nrate)
{
case 0 : return double (rates[nitem].ctm);
case 1 : return rates[nitem].open;
case 2 : return rates[nitem].low;
case 3 : return rates[nitem].high;
case 4 : return rates[nitem].close;
case 5 : return rates[nitem].vol;
}
//---
return ( 0.0 );
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
MT4_EXPFUNC int __stdcall SortStringArray(MqlStr *arr, const int arraysize)
{
//---
if (arr== NULL )
{
printf ( "SortStringArray: NULL array\n" );
return (- 1 );
}
if (arraysize<= 0 )
{
printf ( "SortStringArray: wrong arraysize (%d)\n" , arraysize);
return (- 1 );
}
//---
qsort(arr,arraysize, sizeof (MqlStr),CompareMqlStr);
//---
return (arraysize);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
MT4_EXPFUNC int __stdcall ProcessStringArray(MqlStr *arr, const int arraysize)
{
int len1,len2;
//---
if (arr== NULL )
{
printf ( "ProcessStringArray: NULL array\n" );
return (- 1 );
}
if (arraysize<= 0 )
{
printf ( "ProcessStringArray: wrong arraysize (%d)\n" , arraysize);
return (- 1 );
}
//---
for ( int i= 0 ; i<arraysize- 1 ; i++)
{
if (arr[i]. string == NULL ) len1= 0 ;
else len1=strlen(arr[i]. string );
if (arr[i+ 1 ]. string == NULL ) len2= 0 ;
else len2=strlen(arr[i+ 1 ]. string );
//--- uninitialized string
if (arr[i+ 1 ]. string == NULL ) continue ;
//--- destination string is uninitialized and cannot be allocated within dll
if (arr[i]. string == NULL ) continue ;
//--- memory piece is less than needed and cannot be reallocated within dll
if (arr[i].len<len1+len2) continue ;
//--- final processing
strcat(arr[i]. string ,arr[i+ 1 ]. string );
}
//---
return (arraysize);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CompareMqlStr( const void *left, const void *right)
{
MqlStr *leftstr=(MqlStr *)left;
MqlStr *rightstr=(MqlStr *)right;
//---
if (leftstr-> string == NULL ) return (- 1 ); //-> вот этот знак я не знаю
if (rightstr-> string == NULL ) return ( 1 );
//---
return (strcmp(leftstr-> string ,rightstr-> string ));
}
//+------------------------------------------------------------------+

Ama nasıl çalışıyor? Bu ddl'ye nasıl erişeceğimi tam olarak anlamadım - EA kodundan? Nasıl? İlk olarak, bu gibi görünüyor #include <GetIntValue> Hayır, bir sorun var ..

2. Bir dll çağırırken, stüdyoyu açık tutmak gerekli değildir, değil mi? nasıl yapılır?

Lütfen aynı dll'ye mql kodundan erişmenin en basit örneğini gösterin.

 
Trader7777 :

ben burdan birşey anlamadım..


ikinci bir tek yönlü sipariş açılırsa parti büyüklüğünün katlanarak (2 çarpanıyla) artması gerekir.



sonuç bu

o zaman böyle

 double OrderLotsSell( string sy= "" , int op=- 1 , int mn=- 1 ) { 
 datetime o;
   int       i, k= OrdersTotal (); double r=- 1 ;

   if (sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if (OrderSymbol()==sy || sy== "" ) {
         if ( OrderType()==OP_SELL) {
           if (op< 0 || OrderType()==OP_SELL) {
             if (mn< 0 || OrderMagicNumber()==Magic) {
              r=OrderLots()* 2 ;
            }
          }
        }
      }
    }
  }
   return (r);
}

double OrderLotsBuy( string sy= "" , int op=- 1 , int mn=- 1 ) { 
 datetime o;
   int       i, k= OrdersTotal (); double r=- 1 ;

   if (sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if (OrderSymbol()==sy || sy== "" ) {
         if ( OrderType()==OP_BUY) {
           if (op< 0 || OrderType()==OP_BUY) {
             if (mn< 0 || OrderMagicNumber()==Magic) {
              r=OrderLots()* 2 ;
            }
          }
        }
      }
    }
  }
   return (r);
}





 
max020780 :


sonuç bu

o zaman böyle


teşekkürler, düşünce trenini anladım.. Daha doğru anladım.

bu hat ne için?


 datetime o;
 

İşte başka bir soru. Bir treylerim var. 1 tek yönlü sipariş açık olduğunda, her şey harika çalışıyor, eğer daha fazlaysa, o zaman nedense çalışmıyor. Niye ya?

void Trailing ()
{
for(int i = 0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if(Bid - OrderOpenPrice() > TrailingStop*Point)
{
if (OrderStopLoss() < Bid - (TrailingStop + TrailingStep)*Point)
{
SL = NormalizeDouble(Bid - TrailingStop*Point,Digits);
if (OrderStopLoss() !=SL)
OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);
}
}
}
if (OrderType() == OP_SELL)
{
if(OrderOpenPrice() - Ask > TrailingStop*Point)
{
if (OrderStopLoss() > Ask + (TrailingStop+ TrailingStep)*Point)
{
SL = NormalizeDouble (Ask+TrailingStop*Point,Digits);
if (OrderStopLoss() !=SL)
OrderModify (OrderTicket(), OrderOpenPrice(), SL,0,0);
}
}
}
}
}
}
}


 
Vladimirovits :

İşte projenin .cpp dosyası, bir bakacağım ve birkaç kez Google ve Yandex'e gideceğim, beynimi bulandıran bir şey bulamadım, genel olarak anlaşılır. Hatta basit görünüyor.

Ama nasıl çalışıyor? Bu ddl'ye nasıl erişeceğimi tam olarak anlamadım - EA kodundan? Nasıl? İlk olarak, bu gibi görünüyor #include <GetIntValue> Hayır, bir sorun var ..

Yaklaşık olarak bu şekilde. Çalıştırmak için DLL'yi derlemeniz ve bunu uzmanlar/kütüphaneler klasörüne koymanız gerekir (yardımı ve öğreticiyi okuyun, orada her şey ayrıntılı olarak açıklanmıştır).

 //сначала надо объявить импорт функции из DLL
#import "имя_вашей_длл.dll"
int SortStringArray( string *arr[], const int arraysize);
#import


//в тексте программы вызов проще простого

string arr[];
int size;
...
//где-то в коде массив заполняется
...
//а вот и вызов сортировки
SortStringArray(arr,size);

2. Bir dll çağırırken, stüdyoyu açık tutmak gerekli değildir, değil mi? nasıl yapılır?

Dll, basitçe söylemek gerekirse, içinde uygulanan işlevlerin kullanıcı tarafından değil, başka bir program tarafından çağrılması dışında, sıradan bir Windows programıdır. Bunu mümkün kılmak için, C++ dil derleyicisine __declspec(dllexport) değiştiricisini belirtiyoruz.
 
Trader7777 :

İşte başka bir soru. Bir treylerim var. 1 tek yönlü sipariş açık olduğunda, her şey harika çalışıyor, eğer daha fazlaysa, o zaman nedense çalışmıyor. Niye ya?

void Trailing ()
{
for(int i = 0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if(Bid - OrderOpenPrice() > TrailingStop*Point)
{
if (OrderStopLoss() < Bid - (TrailingStop + TrailingStep)*Point)
{
SL = NormalizeDouble(Bid - TrailingStop*Point,Digits);
if (OrderStopLoss() !=SL)
OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);
}
}
}
if (OrderType() == OP_SELL)
{
if(OrderOpenPrice() - Ask > TrailingStop*Point)
{
if (OrderStopLoss() > Ask + (TrailingStop+ TrailingStep)*Point)
{
SL = NormalizeDouble (Ask+TrailingStop*Point,Digits);
if (OrderStopLoss() !=SL)
OrderModify (OrderTicket(), OrderOpenPrice(), SL,0,0);
}
}
}
}
}
}
}


fonksiyona parametre iletmek gerektiğinden, bunu deneyin

bool IfProfTrail=yanlış; // Yalnızca karlı pozisyonlar için kullanın - başabaş modu
int TrailingStop=0; // Takip mesafesi = 0 - izin verilen minimum
int TrailingStep=1; // mesafe adımı


 void Trailing( string sy= "" , int op=- 1 , int mn=- 1 )
  {
   double po,pp;
   int     i,k= OrdersTotal ();
   

   if (sy== "0" ) sy= Symbol ();
   if (TrailingStop== 0 )TrailingStop=MarketInfo( Symbol (),MODE_STOPLEVEL);
   for (i= 0 ;i<k;i++)
     {
       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
        {
         if ((OrderSymbol()==sy || sy== "" ) && (op< 0 || OrderType()==op))
           {
            po=MarketInfo(OrderSymbol(),MODE_POINT);
             if (mn< 0 || OrderMagicNumber()==mn)
              {
               if (OrderType()==OP_BUY)
                 {
                  pp=MarketInfo(OrderSymbol(),MODE_BID);
                   if ((!IfProfTrail && OrderProfit()> 0 ) || pp-OrderOpenPrice()>TrailingStop*po)
                    {
                     if (OrderStopLoss()<pp-(TrailingStop+TrailingStep- 1 )*po)
                       {
                        ModifyOrder(- 1 ,pp-TrailingStop*po,- 1 );
                       }
                    }
                 }
               if (OrderType()==OP_SELL)
                 {
                  pp=MarketInfo(OrderSymbol(),MODE_ASK);
                   if ((!IfProfTrail && OrderProfit()> 0 ) || OrderOpenPrice()-pp>TrailingStop*po)
                    {
                     if (OrderStopLoss()>pp+(TrailingStop+TrailingStep- 1 )*po || OrderStopLoss()== 0 )
                       {
                        ModifyOrder(- 1 ,pp+TrailingStop*po,- 1 );
                       }
                    }
                 }
              }
           }
        }
     }
  }


 
Forexman77 :

Çok teşekkürler!

Şimdi sorunun ne olduğu ortaya çıktı.

Satın almak için kullanılır:

Bildiğim kadarıyla, satın alma işlemi sor ile yapılıyor ve iClose(Symbol(),Period(),0) fiyatları tekliften alıyor. Sonuç olarak, hata oluşması muhtemeldir.

Şimdi aşağıdaki kombinasyonu kullanıyorum:

Ancak, soru hemen ortaya çıkıyor, çünkü danışman bir pip değil, fiyat uzun süredir satın alma bölgesindeydi ve her tik ile güncellendi.

Anlaşma neden açılmıyor? Danışmanın bir hata üzerine donduğu ve başka bir fiyat değişikliği görmediği ortaya çıktı?

Expert Advisor için şablonu buradan aldım https://c.mql5.com/mql4/book/mq4/experts/tradingexpert.mq4

Sizce bu EA'daki hata işleme işlevine 129 ve 138 hataları için bir kontrol eklemeye değer mi?

Evet ise, o zaman nasıl yapılır?

En azından, tüm hataları ele alan pozisyonları açmak/emirleri ayarlamak için kendi işlevinize sahip olmalısınız. İçinde en son fiyatları almanız gerekiyor.

Herhangi bir yapıya bakmadım. Ancak şunu söyleyeceğim: Expert Advisor'da sunucu tarafından döndürülen tüm hataları işlemeniz gerekir. Ve bu yeterli değil. Öngörülemeyen herhangi bir durumda, işlevsellik kaybı olmadan ve algoritması bozulmadan pozisyonlarını alabilmeli ve olağanüstü bir şey olmamış gibi çalışmalarına devam edebilmelidir.

 
derleyin ve uzmanlar/kütüphaneler klasörüne koyun Teşekkürler!!! Şimdi deneyeceğim. Ve eskiden tanışıyordum ama şimdi konuyla ilgili bu kadar ayrıntılı ve sindirilebilir bir şey bulamıyorum.
 
artmedia70 :

En azından, tüm hataları ele alan pozisyonları açmak/emirleri ayarlamak için kendi işlevinize sahip olmalısınız. İçinde en son fiyatları almanız gerekiyor.

Herhangi bir yapıya bakmadım. Ancak şunu söyleyeceğim: Expert Advisor'da sunucu tarafından döndürülen tüm hataları işlemeniz gerekir. Ve bu yeterli değil. Öngörülemeyen herhangi bir durumda, işlevsellik kaybı olmadan ve algoritması bozulmadan pozisyonlarını alabilmeli ve olağanüstü bir şey olmamış gibi çalışmalarına devam edebilmelidir.


Şablon ders kitabından alınmıştır. Şu anda hata işleme işlevlerinde özellikle güçlü değil.

Emirlerin açılışında RefreshRates() vardır; (dedikleri gibi, teklifler ve talepler piyasa bilgileri aracılığıyla değiştirilir)

 while ( true )                                   // Цикл закрытия орд.
     {
       if (Total== 0 && Opn_B== true )               // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                         // Обновление данных
         SL=Bid - New_Stop(StopLoss)* Point ;     // Вычисление SL откр.
         TP=Bid + New_Stop(TakeProfit)* Point ;   // Вычисление TP откр.
         Alert ( "Попытка открыть Buy. Ожидание ответа.." );
         Ticket= OrderSend (Symb,OP_BUY,Lts,Ask, 2 ,SL,TP); //Открытие Buy
         if (Ticket > 0 )                         // Получилось :)
           {
             Alert ( "Открыт ордер Buy " ,Ticket);
             return ;                             // Выход из start()
           }
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }

Ve hata işleme işlevi:

 int Fun_Error( int Error)                         // Ф-ия обработ ошибок
  {
   switch (Error)
     {                                           // Преодолимые ошибки            
       case    4 : Alert ( "Торговый сервер занят. Пробуем ещё раз.." );
         Sleep ( 3000 );                           // Простое решение
         return ( 1 );                             // Выход из функции
       case 135 : Alert ( "Цена изменилась. Пробуем ещё раз.." );
         RefreshRates();                         // Обновим данные
         return ( 1 );                             // Выход из функции
       case 136 : Alert ( "Нет цен. Ждём новый тик.." );
         while (RefreshRates()== false )           // До нового тика
             Sleep ( 1 );                           // Задержка в цикле
         return ( 1 );                             // Выход из функции
       case 137 : Alert ( "Брокер занят. Пробуем ещё раз.." );
         Sleep ( 3000 );                           // Простое решение
         return ( 1 );                             // Выход из функции
       case 146 : Alert ( "Подсистема торговли занята. Пробуем ещё.." );
         Sleep ( 500 );                             // Простое решение
         return ( 1 );                             // Выход из функции
         // Критические ошибки
       case    2 : Alert ( "Общая ошибка." );
         return ( 0 );                             // Выход из функции
       case    5 : Alert ( "Старая версия терминала." );
         Work= false ;                             // Больше не работать
         return ( 0 );                             // Выход из функции
       case 64 : Alert ( "Счет заблокирован." );
         Work= false ;                             // Больше не работать
         return ( 0 );                             // Выход из функции
       case 133 : Alert ( "Торговля запрещена." );
         return ( 0 );                             // Выход из функции
       case 134 : Alert ( "Недостаточно денег для совершения операции." );
         return ( 0 );                             // Выход из функции
       default : Alert ( "Возникла ошибка " ,Error); // Другие варианты   
         return ( 0 );                             // Выход из функции
     }
  }

sormak istedim. Buna 129 hatadan aşağıdaki satırı ekleyebilir miyim, örneğin bunun gibi?

       case 129 : Alert ( "Неправильные цены. Пробуем ещё раз.." );
         RefreshRates();                         // Обновим данные
         return ( 1 ); 
 
Görsel stüdyonun tüm projesi uzmanlar klasöründe var ... Derleme - bu bir .exe dosyası, değil mi? Kitaplıklar klasörüne kopyalamak istedim ... bulamıyorum! İşte proje hata ayıklama klasörü. Üzgünüm, bu yeni bir konu.