MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 33
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım 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
Tür. Söyle bana, hata nerede?
extern int pointsl= 100 , pointtp= 100 , MagicB= 1111 , MagicS= 2222 , bars= 10 ; extern double lotB= 0.1 , lotS= 0.1 ;
double slB, tpB, slS, tpS; double x= 0 , z= 0 ; int ticketUP, ticketD;
void OnTick ()
{
double maxpr1=- 9999 ; double minpr1= 9999 ;
for ( int shift1= 0 ; shift1<bars; shift1++)
{ double i= iHigh ( Symbol (), PERIOD_CURRENT , shift1);
if (i>maxpr1){maxpr1=i;}}
for ( int shiftA1= 0 ; shiftA1<bars; shiftA1++)
{ double y= iLow ( Symbol (), PERIOD_CURRENT , shiftA1);
if (y<minpr1) {minpr1=y;}}
slS= NormalizeDouble (maxpr1+pointsl* Point , 5 );
tpS= NormalizeDouble (maxpr1-pointtp* Point , 5 );
ticketD= OrderSend ( Symbol (), OP_SELLLIMIT , lotS, maxpr1, 3 , slS, tpS, "" , MagicS, 0 , Blue);
if (ticketD==- 1 ) Print ( "ERROR OP_SELL" ); else Print ( "OP_SELL OK" );
}
Her şey çalışıyor, maxpr1 fiyatına sipariş veriyor.
Sonra aynı şeyi yapmak istiyorum, ancak minpr1 fiyatına:
double slB, tpB, slS, tpS; double x= 0 , z= 0 ; int ticketUP, ticketD;
void OnTick ()
{
double maxpr1=- 9999 ; double minpr1= 9999 ;
for ( int shift1= 0 ; shift1<bars; shift1++)
{ double i= iHigh ( Symbol (), PERIOD_CURRENT , shift1);
if (i>maxpr1){maxpr1=i;}}
for ( int shiftA1= 0 ; shiftA1<bars; shiftA1++)
{ double y= iLow ( Symbol (), PERIOD_CURRENT , shiftA1);
if (y<minpr1) {minpr1=y;}}
slS= NormalizeDouble (minpr1+pointsl* Point , 5 );
tpS= NormalizeDouble (minpr1-pointtp* Point , 5 );
ticketD= OrderSend ( Symbol (), OP_SELLLIMIT , lotS, minpr1, 3 , slS, tpS, "" , MagicS, 0 , Blue);
if (ticketD==- 1 ) Print ( "ERROR OP_SELL" ); else Print ( "OP_SELL OK" );
}
130 hatası yazıyor (yanlış duruyor). Neyi yanlış yapıyorum?
Bekleyen bir emir verirken açılış fiyatı piyasaya çok yakın olamaz. Bekleyen fiyatın mevcut piyasa fiyatından puan cinsinden minimum mesafesi de MODE_STOPLEVEL parametresi ile MarketInfo() işlevi kullanılarak elde edilebilir. Bekleyen bir emrin açılış fiyatının yanlış olması durumunda 130 hatası (ERR_INVALID_STOPS) üretilir.
Hayır, mesele bu değil, orada bir boşluk var. Üstelik satın almak için bekleyenleri de değiştirmeye çalıştım, aynı grafik üzerinde test ettim, aynı hatalar.
Arada boşluk var ama yazılanları okumadığın belli
....... Bekleyen bir emrin açılış fiyatının yanlış olması durumunda 130 hatası (ERR_INVALID_STOPS) oluşacaktır.....
yani OP_SELLLIMIT değerini piyasa fiyatının altına ayarlamaya çalışmak.
Arada boşluk var ama yazılanları okumadığın belli
....... Bekleyen bir emrin açılış fiyatının yanlış olması durumunda 130 hatası (ERR_INVALID_STOPS) oluşacaktır.....
yani OP_SELLLIMIT değerini piyasa fiyatının altına ayarlamaya çalışmak.
for ( int i2=total- 1 ; i2>= 0 ; i2--)
if ( OrderSelect (i2, SELECT_BY_POS ))
if ( OrderSymbol ()== Symbol () )
if ( OrderMagicNumber ()==Magic)
{
if ( OrderType ()== OP_BUY )
{
if (sig2== 1 ) { bool cl = OrderClose ( OrderTicket (), OrderLots (), Bid ,Slip, 0 ); if (cl== false ) { Print ( "OrderClose завершилась с ошибкой #" , GetLastError ());}}
}
if ( OrderType ()== OP_SELL )
{
if (sig2== 2 ) { bool cl = OrderClose ( OrderTicket (), OrderLots (), Ask ,Slip, 0 ); if (cl== false ) { Print ( "OrderClose завершилась с ошибкой #" , GetLastError ());}}
}
if ( OrderType ()== OP_BUYSTOP )
{
if (sig2== 2 &&Delete_Order== true ) { bool del = OrderDelete ( OrderTicket ()); if (del== false ) { Print ( "OrderDelete завершилась с ошибкой #" , GetLastError ());}}
//if (sig==1&&OrderOpenPrice()!=buystop_open&&Ask<buystop_open-stops) {bool mod = OrderModify(OrderTicket(),buystop_open,buystop_sl,0,0);Print("Мод. цены бай стоп=" ,buystop_open,", СЛ=",buystop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
}
if ( OrderType ()== OP_SELLSTOP )
{
if (sig2== 1 &&Delete_Order== true ) { bool del = OrderDelete ( OrderTicket ()); if (del== false ) { Print ( "OrderDelete завершилась с ошибкой #" , GetLastError ());}}
//if (sig==1&&OrderOpenPrice()!=sellstop_open&&Bid>sellstop_open+stops) {bool mod = OrderModify(OrderTicket(),sellstop_open,sellstop_sl,0,0);Print("Мод. цены бай стоп=" ,sellstop_open,", СЛ=",sellstop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
}
}
}
//+------------------------------------------------------------------+
if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // satın alma durağı
Buradaki hata nedir.. Açık anlaşmalar kendiliğinden kapanır, geri dönüş sinyali yoktur..
if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // satın alma durağı
Buradaki hata nedir.. Açık anlaşmalar kendiliğinden kapanır, geri dönüş sinyali yoktur..
Sıfır çubuğunda, olaydan sonra görünmeyen sinyal "titriyor". Test cihazındaki görselleştirmeyi tüm onay işaretlerinde çalıştırın, sorular kaybolacaktır.
sorun bu değil.Emir tetiklendiğinde bir anlaşma açılır ve yeni bir mum belirdiğinde ve geri dönüş sinyali olmadığında hemen kapanır.
Merhaba.
Bana neyin yanlış olduğunu söyle.
M1 döneminde gösterge çizgisi 20. seviyeyi geçtiyse ve M5 döneminde gösterge çizgisi 50. seviyenin üzerindeyse simge ayarlanmalıdır.
Bazı nedenlerden dolayı, M5 üzerindeki çizgi belirtilen 50 seviyesinin altında olsa bile simge yerleştirilir.
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
Comment ( "" );
int limit = rates_total;
int count=prev_calculated;
for ( int i=limit-count; i>= 1 ;i--)
{
//Getting Stochastic buffer values using the iCustom function
double Stoch1 = iStochastic ( NULL , 1 ,KPeriod,DPeriod,Slowing, MODE_SMA , 0 , MODE_MAIN ,i);
double Stoch2 = iStochastic ( NULL , 1 ,KPeriod,DPeriod,Slowing, MODE_SMA , 0 , MODE_MAIN ,i+ 1 );
double Stoch50_1 = iStochastic ( NULL , 5 ,KPeriod1,DPeriod1,Slowing1, MODE_SMA , 0 , MODE_MAIN ,i);
double Stoch50_2 = iStochastic ( NULL , 5 ,KPeriod1,DPeriod1,Slowing1, MODE_SMA , 0 , MODE_MAIN ,i+ 1 );
if (Stoch1> 20 && Stoch2< 20 &&Stoch50_1> 50 )
{
UP[i]= Low [i]-distance*MyPoint;
}
// if (Stoch1< 80 && Stoch2> 80 &&Stoch50_1< 50 )
//{
// DOWN[i]= High [i]+distance*MyPoint;
//}
}
//--- return value of prev_calculated for next call
return (rates_total);
}
Merhaba.
Bana neyin yanlış olduğunu söyle.
M1 döneminde gösterge çizgisi 20. seviyeyi geçtiyse ve M5 döneminde gösterge çizgisi 50. seviyenin üzerindeyse simge ayarlanmalıdır.
Bazı nedenlerden dolayı, M5 üzerindeki çizgi belirtilen 50 seviyesinin altında olsa bile simge yerleştirilir.
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
Comment ( "" );
int limit = rates_total;
int count=prev_calculated;
for ( int i=limit-count; i>= 1 ;i--)
{
//Getting Stochastic buffer values using the iCustom function
double Stoch1 = iStochastic ( NULL , 1 ,KPeriod,DPeriod,Slowing, MODE_SMA , 0 , MODE_MAIN ,i);
double Stoch2 = iStochastic ( NULL , 1 ,KPeriod,DPeriod,Slowing, MODE_SMA , 0 , MODE_MAIN ,i+ 1 );
double Stoch50_1 = iStochastic ( NULL , 5 ,KPeriod1,DPeriod1,Slowing1, MODE_SMA , 0 , MODE_MAIN ,i);
double Stoch50_2 = iStochastic ( NULL , 5 ,KPeriod1,DPeriod1,Slowing1, MODE_SMA , 0 , MODE_MAIN ,i+ 1 );
if (Stoch1> 20 && Stoch2< 20 &&Stoch50_1> 50 )
{
UP[i]= Low [i]-distance*MyPoint;
}
// if (Stoch1< 80 && Stoch2> 80 &&Stoch50_1< 50 )
//{
// DOWN[i]= High [i]+distance*MyPoint;
//}
}
//--- return value of prev_calculated for next call
return (rates_total);
}
Döngünüz garip. Bazı sıra dışı.
if (rates_total<xxx) return ( 0 ); // xxx здесь - количество баров, при которых невозможно рассчитать индикатор
int limit=rates_total-prev_calculated;
if (limit> 1 ) { // limit больше 1 в том случае, когда в истории произошли изменения
limit=rates_total- 1 ; // не обязательно -1, если в цикле есть i+1, значит limit=rates_total-2, и т.д., и т.п.
// тут проводим действия когда нужно пересчитать всю историю
}
//---
for ( int i=limit; i>= 0 ; i--) {
// основной цикл индикатора
}
//+------------------------------------------------------------------+
Neden 1'den fazla limit kontrol ediliyor. Örneğin, geçmiş yüklendi ve fark birden fazla olacak. Her şey yolundaysa, o zaman oranları_toplam-önceki_hesaplanan arasındaki fark ya 0 ya da 1'dir.
0 - yeni bir kene geldi, yeni bir çubuk oluşmaya başlamadı.
1 - yeni bir kene geldi ve yeni bir çubuk oluşmaya başladı
Tüm göstergenizi gösterin - orada neyin yanlış olduğunu görelim.