Bir diziyle çalışmak için bir sınıf şablonu vardır.
#property strict#include <ObjectVariables.mqh>
#include <Arrays\varQSort.mqh>
#include <Arrays\objQSort.mqh>
template < typename T1>
class ArrayList
{
private :
T1 array[];
QuickSorts<T1> *qs;
int size;
int index;
public :
//прочие функцииvoid QuickSort(); //отсортировать массив//прочие функции
};
//+------------------------------------------------------------------+//| Сортировка массиваtemplate < typename T1>
void ArrayList::QuickSort()
{
int idx = index; //сохранение положения индексаif (IsPointer(array[ 0 ])) // true - массив содержит указатели класса
qs /*ошибка 2*/ = new ObjQSort<T1>();
else
qs /*ошибка 2*/ = new VarQSort<T1>();
qs.Sort(array, 0 , index);
index = idx;
}
Bir dizinin karmaşık veri türlerini depolayabildiği gerçeği göz önüne alındığında, bu sınıf şablonunun sıralama uygulaması gerekir. Örneğin:
ArrayList<PP*> *dde; // PP - класс
Basit türler ve karmaşık olanlar için farklı işlevler yazabilirsiniz, ancak derleyici işlevlerin veri türüne göre kesinlikle sınırlandırıldığını anlamaz ve yemin etmeye devam eder: '<' - geçersiz işlem ArrayList.mqh'yi kullanır
Sonra arayüzü gömmeye karar verdim:
#property stricttemplate < typename T1>
interface QuickSorts
{
void Sort(T1 &array[], int beg, int end);
};
#property strict#include <Arrays\QuickSorts.mqh>
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+template < typename T1>
class VarQSort : public/*ошибка 1*/ QuickSorts
{
private :
public :
void Sort(T1 &array[], int beg, int end);
VarQSort(){}
~VarQSort(){}
};
template < typename T1>
void VarQSort::Sort(T1 &array[], int beg, int end)
{
//алгоритм функции
}
#property strict#include <Arrays\QuickSorts.mqh>
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+template < typename T1>
class ObjQSort : public /*ошибка 1*/ QuickSorts
{
private :
public :
void Sort(T1 &array[], int beg, int end){}
ObjQSort(){}
~ObjQSort(){}
};
Tasarımın tüm parçaları derlenmiştir. Ama bunu beyan etmeye çalışırsanız:
Bu tür uyumsuzluğu ortadan kaldırmak için kodda nelerin düzeltilmesi gerekiyor? Neden böyle olduğunu anlamıyorum.
not '<' - geçersiz işlem varQSort.mqh kullanımı bu tasarımda beni rahatsız ediyor. Ve tam olarak kurtulmak istediğim şey buydu. Ama bu hata benim için açık, ama bu ikisi değil.
template < typename T1>
class VarQSort : public QuickSorts <T1>//....template < typename T1>
class ObjQSort : public QuickSorts <T1>//....
extern int minutes = 5; // Время торговли(минут)
bool HOUR = true; // Часы Вкл (true) / Выкл (folse)
//Отправляет true если по времени разрешено торговатьbool isTradeTimeString()
{
datetime servertime = TimeCurrent ();
datetime localtime = TimeLocal ();
datetime time = 0 ;
datetime hbegin = 0 ;
datetime hend = 0 ;
string TimeBegin = "00:00" ;
if ( DayOfWeek () == 1 ){ if (monday == 1 ){TimeBegin = monday_open1;} else { return ( false );}}
if ( DayOfWeek () == 2 ){ if (tuesday == 1 ){TimeBegin = tuesday_open1;} else { return ( false );}}
if ( DayOfWeek () == 3 ){ if (wednesday == 1 ){TimeBegin = wednesday_open1;} else { return ( false );}}
if ( DayOfWeek () == 4 ){ if (thursday == 1 ){TimeBegin = thursday_open1;} else { return ( false );}}
if ( DayOfWeek () == 5 ){ if (friday == 1 ){TimeBegin = friday_open1;} else { return ( false );}}
string TimeEnd = TimeToString ( StrToTime (TimeBegin)+( 60 *minutes), TIME_MINUTES );
if (servertime > localtime)
{
time = servertime - localtime;
hbegin = StrToTime (TimeBegin) + time;
hend = StrToTime (TimeEnd) + time;
}
if (servertime < localtime)
{
time = localtime - servertime;
hbegin = StrToTime (TimeBegin) - time;
hend = StrToTime (TimeEnd) - time;
}
if (localtime == servertime)
{
hbegin = StrToTime (TimeBegin);
hend = StrToTime (TimeEnd);
}
datetime dtBegin, dtEnd; // Время начала и окончания работыint hc, he; // Часы текущего времени и окончания работы
dtBegin= StrToTime ( TimeToStr ( TimeCurrent (), TIME_DATE )+ " " + TimeToStr (hbegin, TIME_MINUTES ));
dtEnd= StrToTime ( TimeToStr ( TimeCurrent (), TIME_DATE )+ " " + TimeToStr (hend, TIME_MINUTES ));
hc = TimeHour ( TimeCurrent ());
he = TimeHour (dtEnd);
if (dtBegin>=dtEnd)
{
if (hc>=he)
dtEnd+= 24 * 60 * 60 ;
else
dtBegin-= 24 * 60 * 60 ;
}
if (HOUR== true )
{
if ( TimeCurrent ()>=dtBegin && TimeCurrent ()<=dtEnd)
return ( true );
else
{
if (CountTrades()== 0 )
return ( false );
}
}
return ( true );
}
Buna ihtiyacım var mesela Pazartesi günü 2 yada 3 tane fırsat açmanız gerekiyorsa fonksiyon zamanı karşılaştırıp emeği gönderiyor ama şimdilik benim için bir sefer karşılaştırıyor.
Böylece, tekliflerin dışa aktarılmasında, hangi tarihten ve hangi tarihe kadar yüklemek istediğinizi seçebilirsiniz.
aksi halde "indir" butonuna tıkladığınızda 6.000.000 fiyat teklifi indirilir. herkes sabit diski alıntı verileriyle doldurmak, indirilene kadar uzun süre beklemek ve ardından alıntı tablosundaki gereksiz verileri kaldırmak istemez.
... ve nedeni büyük olasılıkla (Ask+8*D*Noktası)<OrderStopLoss() durumundadır ,kaldırılırsa SL ayarlanır, ancak belirtilen koşul olmadan TrailingStop düzgün çalışmaz ...
SATIN ALemirleriiçin(Bid-8*D*Point)>OrderStopLoss() koşulu,OrderStopLoss()==0kabul edilirdoğru (yani bir değer > 0 ) ...
... ancakSATIŞ siparişleri için koşul(Ask+8*D*Puan)<OrderStopLoss(),ne zaman OrderStopLoss()==0kabul edilirOLUMSUZLUKdoğru (yani, < 0 bir değer elde edilir) ...
Birisi banaSATIŞemirleriyleTrailingStop'undoğru çalışması için kodda gerekli koşulu nasıl doğru bir şekilde formüle edeceğimi söyleyebilir mi (Ask+8*D*Noktası)<OrderStopLoss().
Tünaydın! Göstergenin kene geçmişi dosyasını okuduğu bir işlev vardır. Ancak gösterge yüklenirken veya güncellenirken okuma yalnızca bir kez gerçekleşir. Sıfır çubuğunun ilk işareti her göründüğünde okuma nasıl yapılır?
Merhaba canım ... SATIN AL siparişleri için belirtilen TrailingStop kodunun neden doğru çalıştığını söyleyen var mı?
... ve SAT emirleri için benzerleri hiç SL belirlemez ...
... ve nedeni büyük olasılıkla (Ask+8*D*Noktası)<OrderStopLoss() durumundadır ,kaldırılırsa SL ayarlanır, ancak belirtilen koşul olmadan TrailingStop düzgün çalışmaz ...
SATIN ALemirleriiçin(Bid-8*D*Point)>OrderStopLoss() koşulu,OrderStopLoss()==0kabul edilirdoğru (yani bir değer > 0 ) ...
... ancakSATIŞ siparişleri için koşul(Ask+8*D*Puan)<OrderStopLoss(),ne zaman OrderStopLoss()==0kabul edilirOLUMSUZLUKdoğru (yani, < 0 bir değer elde edilir) ...
Birisi banaSATIŞemirleriyleTrailingStop'undoğru çalışması için kodda gerekli koşulu nasıl doğru bir şekilde formüle edeceğimi söyleyebilir mi (Ask+8*D*Noktası)<OrderStopLoss().
Cevap veren herkese şimdiden teşekkürler.
Herkese merhaba ... forumun bu başlığında acı verici derecede düşük aktivite var ... bu sorun bu şekilde çözüldü ...
...biraz uzun bir durum ama çalışıyor... Daha kısa yazmayı bilenler kısaltabilir, cevap verebilir, minnettar kalırım ... Gerisi olduğu gibi kullanabilir.
tam lot büyüklüğüne sahip bir bilete bir siparişi kapatmak.
böylece lot, fiyat, kayma belirtmenize gerek kalmaz.
terminaldeki bir siparişte bir çarpı işaretine tıklamaya benzer.
fonksiyona gir
SiparişKapatByPos(0)
pozisyona göre bir siparişi kapatma.
ve o zaman bu hantal yapıları reçete etmek gerekli olmayacak.
for(inti=1; i<=OrdersTotal(); i++)//Цикл по всем ордерам,..{//отражённым в терминалеif(OrderSelect(i-1,SELECT_BY_POS)==true)//Если есть следующий{// Здесь должен выполняться ..// ..анализ характеристик ордеров }}//Конец тела цикла
Merhaba! İki eksi s x sayı q ve w yanlış karşılaştırılır, eşit olduklarında if operatörü birinin diğerinden büyük olduğunu düşünür.Hata nedir? q = -0.0002 ve w de -0.0002 olduğunda, res12=yanlış, neden?
tezin teyidi: hareket = yaşam, dinlenme = ölüm. Bir dergide ne yazıyor? bunlar sağ alttaki iki sekme
Olsaydı kontrol edip düzeltirdim...
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
Yeni başlayanlardan sorular MQL4 MT4 MetaTrader 4
İlya Prozumentov , 2017.06.11 13:53
Bir diziyle çalışmak için bir sınıf şablonu vardır.Bir dizinin karmaşık veri türlerini depolayabildiği gerçeği göz önüne alındığında, bu sınıf şablonunun sıralama uygulaması gerekir. Örneğin:
ArrayList<PP*> *dde; // PP - классBasit türler ve karmaşık olanlar için farklı işlevler yazabilirsiniz, ancak derleyici işlevlerin veri türüne göre kesinlikle sınırlandırıldığını anlamaz ve yemin etmeye devam eder:
'<' - geçersiz işlem ArrayList.mqh'yi kullanır
Sonra arayüzü gömmeye karar verdim:
Tasarımın tüm parçaları derlenmiştir. Ama bunu beyan etmeye çalışırsanız:
ArrayList<PP*> *dde; // PP - классdaha sonra, dosyayı derlerken hatalar şunlardır:'QuickSorts' - şablon uyuşmazlığı varQSort.mqh /*hata 1*/
'=' - tür uyumsuzluğu ArrayList.mqh /*hata 2*/
notBu tür uyumsuzluğu ortadan kaldırmak için kodda nelerin düzeltilmesi gerekiyor? Neden böyle olduğunu anlamıyorum.
'<' - geçersiz işlem varQSort.mqh kullanımı
bu tasarımda beni rahatsız ediyor. Ve tam olarak kurtulmak istediğim şey buydu. Ama bu hata benim için açık, ama bu ikisi değil.
Buna ihtiyacım var mesela Pazartesi günü 2 yada 3 tane fırsat açmanız gerekiyorsa fonksiyon zamanı karşılaştırıp emeği gönderiyor ama şimdilik benim için bir sefer karşılaştırıyor.
aksi halde "indir" butonuna tıkladığınızda 6.000.000 fiyat teklifi indirilir. herkes sabit diski alıntı verileriyle doldurmak, indirilene kadar uzun süre beklemek ve ardından alıntı tablosundaki gereksiz verileri kaldırmak istemez.
Merhaba canım ... SATIN AL siparişleri için belirtilen TrailingStop kodunun neden doğru çalıştığını söyleyen var mı?
... ve SAT emirleri için benzerleri hiç SL belirlemez ...
... ve nedeni büyük olasılıkla ( Ask + 8 *D* Noktası )< OrderStopLoss () durumundadır , kaldırılırsa SL ayarlanır, ancak belirtilen koşul olmadan TrailingStop düzgün çalışmaz ...
SATIN AL emirleri için ( Bid - 8 *D* Point )> OrderStopLoss () koşulu, OrderStopLoss ()==0 kabul edilir doğru (yani bir değer > 0 ) ...
... ancak SATIŞ siparişleri için koşul ( Ask + 8 *D* Puan )< OrderStopLoss (), ne zaman OrderStopLoss ()==0 kabul edilir OLUMSUZLUK doğru (yani, < 0 bir değer elde edilir) ...
Birisi bana SATIŞ emirleriyle TrailingStop'un doğru çalışması için kodda gerekli koşulu nasıl doğru bir şekilde formüle edeceğimi söyleyebilir mi ( Ask + 8 *D* Noktası )< OrderStopLoss () .
Cevap veren herkese şimdiden teşekkürler.
Tünaydın! Göstergenin kene geçmişi dosyasını okuduğu bir işlev vardır. Ancak gösterge yüklenirken veya güncellenirken okuma yalnızca bir kez gerçekleşir. Sıfır çubuğunun ilk işareti her göründüğünde okuma nasıl yapılır?
void ProcessOldCandles(int limit, TickStruct &lastTick)
{
int hTicksFile = FileOpen(Symbol() + ".tks", FILE_BIN | FILE_READ | FILE_SHARE_READ | FILE_SHARE_WRITE);
if (hTicksFile < 1)
return;
TickStruct tick;
while (!IsStopped())
{
if (!IsReadTimeAndBidAskOfTick(hTicksFile, tick))
return;
if (tick.time >= Time[limit])
break;
}
lastTick = tick;
int barIndex = iBarShift(NULL, 0, tick.time);
while (barIndex >= 0)
{
if (!IsReadTimeAndBidAskOfTick(hTicksFile, tick))
return;
if (!IsTickBelongToBar(tick, barIndex))
barIndex = iBarShift(NULL, 0, tick.time);
ProcessOneTick(barIndex, tick, lastTick);
}
FileClose(hTicksFile);
Merhaba canım ... SATIN AL siparişleri için belirtilen TrailingStop kodunun neden doğru çalıştığını söyleyen var mı?
... ve SAT emirleri için benzerleri hiç SL belirlemez ...
... ve nedeni büyük olasılıkla ( Ask + 8 *D* Noktası )< OrderStopLoss () durumundadır , kaldırılırsa SL ayarlanır, ancak belirtilen koşul olmadan TrailingStop düzgün çalışmaz ...
SATIN AL emirleri için ( Bid - 8 *D* Point )> OrderStopLoss () koşulu, OrderStopLoss ()==0 kabul edilir doğru (yani bir değer > 0 ) ...
... ancak SATIŞ siparişleri için koşul ( Ask + 8 *D* Puan )< OrderStopLoss (), ne zaman OrderStopLoss ()==0 kabul edilir OLUMSUZLUK doğru (yani, < 0 bir değer elde edilir) ...
Birisi bana SATIŞ emirleriyle TrailingStop'un doğru çalışması için kodda gerekli koşulu nasıl doğru bir şekilde formüle edeceğimi söyleyebilir mi ( Ask + 8 *D* Noktası )< OrderStopLoss () .
Cevap veren herkese şimdiden teşekkürler.
Herkese merhaba ... forumun bu başlığında acı verici derecede düşük aktivite var ... bu sorun bu şekilde çözüldü ...
...biraz uzun bir durum ama çalışıyor... Daha kısa yazmayı bilenler kısaltabilir, cevap verebilir, minnettar kalırım ... Gerisi olduğu gibi kullanabilir.
fonksiyona gir
SiparişKapatByTicket (542534564)
tam lot büyüklüğüne sahip bir bilete bir siparişi kapatmak.
böylece lot, fiyat, kayma belirtmenize gerek kalmaz.
terminaldeki bir siparişte bir çarpı işaretine tıklamaya benzer.
fonksiyona gir
SiparişKapatByPos(0)
pozisyona göre bir siparişi kapatma.
ve o zaman bu hantal yapıları reçete etmek gerekli olmayacak.
Merhaba! İki eksi s x sayı q ve w yanlış karşılaştırılır, eşit olduklarında if operatörü birinin diğerinden büyük olduğunu düşünür.Hata nedir? q = -0.0002 ve w de -0.0002 olduğunda, res12=yanlış, neden?