Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 421
![MQL5 - MetaTrader 5 müşteri terminalinde yerleşik ticaret stratejileri dili](https://c.mql5.com/i/registerlandings/logo-2.png)
Ticaret fırsatlarını kaçırıyorsunuz:
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Sadece çubuğu değiştirirken bir hesaplama yaptım - kendi yöntemim :) Optimizasyon için fikirleriniz varsa dinlerim!
//+------------------------------------------------------------------+
//| Target.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link " https://www.mql5.com "
#property version "1.00"
#property strict
double CC;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if (Close[1]-CC!=0)
{
CC=Close[1];
double MAT=NormalizeDouble(iMA(Symbol(),0,100,0,0,0,0),Digits);
double S=11*Point;
double Target;
int Buy=1;
int Sell=1;
if(Open[0]-MAT>S || MAT-Open[0]<S) //Условие убытка - надо искать новый TP
{
if(Buy==1) //Если условно ордеров на покупку больше, чем ордеров на продажу (проверять лучше по объему позиции)
{
double TargetMassiv[5]; //Создаем массив
double TargetMassivOk[5]; //Создаем массив
int N=0; //Переменная для изменения размера массива
int X=0; //Переменная для получение информации о номере индекса массива, наиболее соответствующему усредненному значению массива
int Max=0;
int Min=0;
int MaxBuy=0;
int MinBuy=0;
double sr_Target=0;
ArrayFree (TargetMassiv); //Очищаем массив
ArrayFree (TargetMassivOk); //Очищаем массив
ArrayResize(TargetMassiv,5,0); //Восстанавливаем размер массива
ArrayResize(TargetMassivOk,5,0); //Восстанавливаем размер массива
TargetMassiv[0]=NormalizeDouble (iMA(Symbol(),0,100,0,0,0,100),Digits);
TargetMassiv[1]=NormalizeDouble (iMA(Symbol(),0,100,0,1,0,0),Digits);
TargetMassiv[2]=NormalizeDouble (iMA(Symbol(),0,55,0,2,0,0),Digits);
TargetMassiv[3]=NormalizeDouble (iMA(Symbol(),0,88,0,3,0,0),Digits);
TargetMassiv[4]=NormalizeDouble (iMA(Symbol(),0,12,0,0,0,0),Digits);
for(int i=0;i<5;i++) //Записываем значение в новый массив по условию
{
if(TargetMassiv[i]>MAT && TargetMassiv[i]!=0)
{
TargetMassivOk[i]=TargetMassiv[i];
N++;
}
}
ArraySort(TargetMassivOk,WHOLE_ARRAY,0,MODE_DESCEND); //Сортировка массива
if(N!=0)
{
ArrayResize(TargetMassivOk,N,0);
Max=ArrayMaximum(TargetMassiv,WHOLE_ARRAY,0);
Min=ArrayMinimum(TargetMassiv,WHOLE_ARRAY,0);
MaxBuy=ArrayMaximum(TargetMassivOk,WHOLE_ARRAY,0);
MinBuy=ArrayMinimum(TargetMassivOk,WHOLE_ARRAY,0);
sr_Target=NormalizeDouble(iMAOnArray(TargetMassivOk,0,N,0,0,0),Digits);
if(N==0)
{X=N;}
else
{
for(int i=0;i<N-1;i++)
{
if(sr_Target<=TargetMassivOk[i] && sr_Target>TargetMassivOk[i+1]) X=i; //Берем большее значение т.к. для ордеров на покупку
}
}
Target=TargetMassivOk[X];
}
else
{
Max=0;
Min=0;
MaxBuy=0;
MinBuy=0;
sr_Target=0;
Target=-1;
}
Print("Покупка");
Print("Значения последних 5 элементов массива");
for(int i=0;i<5;i++) printf("TargetMassiv[%d] = %G",i,TargetMassiv[i]);
for(int i=0;i<N;i++) printf("TargetMassivOk[%d] = %G",i,TargetMassivOk[i]);
Print("MAT= ",MAT);
Print("Max= ",TargetMassiv[Max],"Min=",TargetMassiv[Min],"MaxBuy=",TargetMassivOk[MaxBuy],"MinBuy=",TargetMassivOk[MinBuy]);
Print("Среднее значение массива TargetMassivOk= ",sr_Target);
Print("Среднее значение массива TargetMassivOk наиболее соответствует индексу= ",X);
Print("Target= ",Target);
}
/////////////////////////////////////////////////////////////////////////////
if(Sell==1) //Если условно ордеров на продажу больше, чем ордеров на продажу (проверять лучше по объему позиции)
{
double TargetMassiv[5]; //Создаем массив
double TargetMassivOk[5]; //Создаем массив
int N=0; //Переменная для изменения размера массива
int X=0; //Переменная для получение информации о номере индекса массива, наиболее соответствующему усредненному значению массива
int Max=0;
int Min=0;
int MaxSell=0;
int MinSell=0;
double sr_Target=0;
ArrayFree (TargetMassiv); //Очищаем массив
ArrayFree (TargetMassivOk); //Очищаем массив
ArrayResize(TargetMassiv,5,0); //Восстанавливаем размер массива
ArrayResize(TargetMassivOk,5,0); //Восстанавливаем размер массива
TargetMassiv[0]=NormalizeDouble (iMA(Symbol(),0,100,0,0,0,100),Digits);
TargetMassiv[1]=NormalizeDouble (iMA(Symbol(),0,100,0,1,0,0),Digits);
TargetMassiv[2]=NormalizeDouble (iMA(Symbol(),0,55,0,2,0,0),Digits);
TargetMassiv[3]=NormalizeDouble (iMA(Symbol(),0,88,0,3,0,0),Digits);
TargetMassiv[4]=NormalizeDouble (iMA(Symbol(),0,12,0,0,0,0),Digits);
// for(int i=0;i<5;i++)
for(int i=4; i>=0; i--)
{
if(TargetMassiv[i]<MAT && TargetMassiv[i]!=0) //Записываем значение в новый массив по условию
{
TargetMassivOk[i]=TargetMassiv[i];
N++;
}
}
Print("N=",N);
for(int i=0;i<N;i++) printf("До обработки TargetMassivOk[%d] = %G",i,TargetMassivOk[i]);
ArraySort(TargetMassivOk,WHOLE_ARRAY,0,MODE_DESCEND);
// ArraySort(TargetMassivOk,N,0,MODE_ASCEND); //Сортировка массива
if(N!=0)
{
ArrayResize(TargetMassivOk,N,0);
// ArraySort(TargetMassivOk,WHOLE_ARRAY,0,MODE_DESCEND); //Дополнительная сортировка
Max=ArrayMaximum(TargetMassiv,WHOLE_ARRAY,0);
Min=ArrayMinimum(TargetMassiv,WHOLE_ARRAY,0);
MaxSell=ArrayMaximum(TargetMassivOk,WHOLE_ARRAY,0);
MinSell=ArrayMinimum(TargetMassivOk,WHOLE_ARRAY,0);
sr_Target=NormalizeDouble(iMAOnArray(TargetMassivOk,0,N,0,0,0),Digits);
for(int i=0;i<N-1;i++)
{
if(sr_Target<=TargetMassivOk[i] && sr_Target>TargetMassivOk[i+1]) X=i;
// if (X=!0) X=X-1;
}
Target=TargetMassivOk[X];
}
else
{
Max=0;
Min=0;
MaxSell=0;
MinSell=0;
sr_Target=0;
Target=-1;
}
Print("Продажа");
Print("Значения последних 5 элементов массива");
for(int i=0;i<5;i++) printf("TargetMassiv[%d] = %G",i,TargetMassiv[i]);
for(int i=0;i<N;i++) printf("TargetMassivOk[%d] = %G",i,TargetMassivOk[i]);
Print("MAT=",MAT);
Print("Max=",TargetMassiv[Max],"Min=",TargetMassiv[Min],"MaxSell=",TargetMassivOk[MaxSell],"MaxSell=",TargetMassivOk[MinSell]);
Print("Среднее значение массива TargetMassivOk= ",sr_Target);
Print("Среднее значение массива TargetMassivOk наиболее соответствует индексу= ",X);
Print("Target= ",Target);
}
}
}
}
//+------------------------------------------------------------------+
Tahmin etmediler - numaralandırma yine de işe yarıyor, eğer indeks değeri dizinin boyutunu aşarsa, lanetler alacaktı, ama yapmıyorlar. Sıfırlı bir değer varken N sıfıra eşit olmayabilir! Kontrolün de gerçekleştiği ortaya çıktı, ardından dizinin veri yazmadığı ortaya çıktı.
Tahmin etmedim, ancak önerilen döngünün yanlışlığına dikkat çektim. Beş kişilik bir dizi boyutuyla nereden ve nereye kendi başınıza düşünün, döngüye ihtiyacınız var ...
Hem benim hem de sizin versiyonunuzda beş değer var, fark nedir - lütfen açıklayın.
Dizinin boyutu beştir. Diziyi sıfır dahil 4'ten 0'a indekslerseniz, döngü dizinin tüm değerlerinden geçecektir. Beşten indekslemeye çalışırsanız, sınırların dışında bir dizi olacaktır. Sıfır dahil olmak üzere 4'ten sıfıra indekslerseniz, döngü tüm diziden geçmez - dizinin sıfır hücresi okunmaz.
Yani şu şekilde doğrudur:
for(int i=4; i>=0; i--) {}
veya
for(int i=0; i<5; i++) {}
Dizi boyutu beştir. Diziyi sıfır dahil 4'ten 0'a indekslerseniz, döngü dizinin tüm değerlerinden geçecektir. Beşten indekslemeye çalışırsanız, sınırların dışında bir dizi olacaktır. Sıfır dahil olmak üzere 4'ten sıfıra indekslerseniz, döngü tüm diziden geçmez - dizinin sıfır hücresi okunmaz.
Yani şu şekilde doğrudur:
for(int i=4; i>=0; i--) {}
veya
for(int i=0; i<5; i++) {}
sondan yineleyin (çünkü yineleme, liste değiştiğinde önce verileri kaybedebilir)
Leanid Aladzyeu :
Leanid Aladzyeu :
sondan yineleyin (çünkü yineleme, liste değiştiğinde önce verileri kaybedebilir)
Merak etmekten asla vazgeçmiyorum... İnsanlar neden dikiz aynalarını kullanmayı öğrenmek yerine, yolun kurallarının bir noktasını öğrenip dönüş sinyalini açıp bakmadan ilerliyorlar ???
Neden, açık olanlar listesinden birkaç siparişi kapatırken, siparişleri daha büyük bir dizinden daha küçük bir dizine göre sıralamak gerektiğini bir kez okuduktan sonra, uygularlar ve EVEN başkalarına her yerde ve her yerde böyle bir numaralandırma yönünü uygulamalarını tavsiye eder. ..
Merak etmekten asla vazgeçmiyorum... İnsanlar neden dikiz aynalarını kullanmayı öğrenmek yerine, yolun kurallarının bir noktasını öğrenip dönüş sinyalini açıp bakmadan ilerliyorlar ???
Neden, açık olanlar listesinden birkaç siparişi kapatırken, siparişleri daha büyük bir dizinden daha küçük bir dizine göre sıralamak gerektiğini bir kez okuduktan sonra, uygularlar ve EVEN başkalarına her yerde ve her yerde böyle bir numaralandırma yönünü uygulamalarını tavsiye eder. ..
Merak etmekten asla vazgeçmiyorum... İnsanlar neden dikiz aynalarını kullanmayı öğrenmek yerine, yolun kurallarının bir noktasını öğrenip dönüş sinyalini açıp bakmadan ilerliyorlar ???
Neden, açık olanlar listesinden birkaç siparişi kapatırken, siparişleri daha büyük bir dizinden daha küçük bir dizine göre sıralamak gerektiğini bir kez okuduktan sonra, uygularlar ve EVEN başkalarına her yerde ve her yerde böyle bir numaralandırma yönünü uygulamalarını tavsiye eder. ..
Dilediğiniz gibi sayma ihtimalini sikeyim, bir zamanlar sondan ilk kapanışa kadar gergindim, tam tersi olmalıydı. Ve yaptı, sadece nüanslar var, sadece sayacı çevirmek için değil.
Bu, döngüdeki yineleme sırasında silinen her şey için geçerlidir (siparişler, grafik nesneleri vb.) çünkü silerken, "nesne dizisinin" önceki hücreleri sonraki "nesneler" ile doldurulur. Genel olarak, elbette, durum üzerine inşa etmeniz gerekir. Örneğin, gösterge yazarken son elemandan (rates_total-1) çizime başlamak, en hafif tabirle saçmadır.
Sanki bana nasıl doğru yapılacağını açıklıyormuşsun gibi? Yoksa bir şey mi anlamadım?
Aslında, ıssız bir yolda ilerliyorsam ve etrafta tek bir araba veya traktör görmüyorsam, dönüş sinyalini açmıyorum.