MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 31
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
Hata, kodda, sipariş seçimi alanında daha yüksek bir yerdedir.
Evet, geri kalanına dokunmuyorum.
Her durumda, yalnızca koşullu satırları değil, önceki ve sonraki kodu görmeniz gerekir.
...
SRC'nin yardımıyla kodu taramak ve normal bir şekilde yerleştirmek - bu kader değil mi?
Silmeyi denemeden önce neden OrderSelect'i kullanmıyorsunuz ?
...
Birinde emir ve pozisyon sayısı ile ilgili yapının gerekli alanlarını doldurabiliyorken, neden bu kadar çok döngüye ihtiyacınız olduğu açık değil.
Fazlalık kaldırıldı ve kaldırma da kaldırıldı. Biletle silmeniz gerekmez (silmeden önce yine de bilmeniz gerekir), ancak bir döngüde dizine göre istediğiniz sırayı bulun ve silin.
Bu yüzden, bir koşul oluştuğunda çağrılması gereken siparişleri aramak ve silmek için bir fonksiyona daha ihtiyacımız var, ancak kodunuza bakarken hangisinin hemen anlamadım ve bunu anlamaya zaman yoktu. Gerekli koşulları kelimelerle anlatın, nasıl sileceğinizi anlatalım.
Dizime bakmadan yazdım, bu yüzden yapıyı sipariş ve pozisyon sayısı ile doldurma işlevinde söveler olabilir - kontrol etmedim.
input double LotB= 0.1 ; // Лот Buy
input double LotS= 0.1 ; // Лот Sell
input int Pointsl= 100 ; // StopLoss в пунктах
input int Pointtp= 100 ; // TakeProfit в пунктах
input int NumBars= 10 ; // Количество баров для поиска Max/Min
input int Magic= 100500 ; // Magic
//--- global variables
struct DataNumOrders
{
int buy; // Количество позиций Buy
int sell; // Количество позиций Sell
int buy_limit; // Количество ордеров BuyLimit
int buy_stop; // Количество ордеров BuyStop
int sell_limit; // Количество ордеров SellLimit
int sell_stop; // Количество ордеров SellStop
};
DataNumOrders numOrders; // Количество ордеров
double lotB, lotS;
int pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
numBars=(NumBars< 1 ? 1 :NumBars> Bars ? Bars :NumBars);
pointsl=(Pointsl< 0 ? 0 :Pointsl);
pointtp=(Pointtp< 0 ? 0 :Pointtp);
double minLot= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MIN );
double maxLot= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MAX );
lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick ()
{
//--- заполним структуру количеством ордеров и позиций
GetNumOrders( Symbol (),Magic,numOrders);
//--- найдём максимальную и минимальную цены за bars свечей
double maxPrice= 0.0 ; double minPrice= DBL_MAX ;
for ( int i= 0 ; i<numBars; i++) {
double max_i= iHigh ( Symbol (), PERIOD_CURRENT ,i);
if (max_i>maxPrice) maxPrice=max_i;
double min_i= iLow ( Symbol (), PERIOD_CURRENT ,i);
if (min_i<minPrice) minPrice=min_i;
}
//--- выставим BuyLimit
if (numOrders.buy_limit== 0 && numOrders.buy== 0 ) {
double slB=(pointsl== 0 ? 0 : NormalizeDouble (minPrice-pointsl* Point (), Digits ()));
double tpB=(pointtp== 0 ? 0 : NormalizeDouble (minPrice+pointtp* Point (), Digits ()));
int ticketUP= OrderSend ( Symbol (), OP_BUYLIMIT , lotB, minPrice, 3 , slB, tpB, "" , Magic, 0 , clrRed );
if (ticketUP==- 1 ) Print ( "ERROR OP_BUY" );
else Print ( "OP_BUY OK" );
}
//--- выставим SellLimit
if (numOrders.buy_limit== 0 && numOrders.sell== 0 ) {
double slS=(pointsl== 0 ? 0 : NormalizeDouble (maxPrice+pointsl* Point (), Digits ()));
double tpS=(pointtp== 0 ? 0 : NormalizeDouble (maxPrice-pointtp* Point (), Digits ()));
int ticketD= OrderSend ( Symbol (), OP_SELLLIMIT , lotS, maxPrice, 3 , slS, tpS, "" , Magic, 0 , clrBlue );
if (ticketD==- 1 ) Print ( "ERROR OP_SELL" );
else Print ( "OP_SELL OK" );
}
//--- Тут должно быть удаление, но не понятно при каких условиях. Опишите их
//---
string a=(numBars== 1 )? "bar: " : IntegerToString (numBars, 1 )+ " bar's: " ;
Comment ( "Last " , a, "max " , DoubleToStr (maxPrice, Digits ()), ", min " , DoubleToStr (minPrice, Digits ()), "." );
}
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров |
//+------------------------------------------------------------------+
void GetNumOrders( string symbol_name, int magic_number, DataNumOrders &number_of) {
ZeroMemory (number_of);
for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) {
if ( OrderSelect (i, SELECT_BY_POS )) {
if ( OrderMagicNumber ()!=magic_number) continue ;
if ( OrderSymbol ()!=symbol_name) continue ;
if ( OrderType ()== OP_BUY ) number_of.buy++;
if ( OrderType ()== OP_BUYLIMIT ) number_of.buy_limit++;
if ( OrderType ()== OP_BUYSTOP ) number_of.buy_stop++;
if ( OrderType ()== OP_SELL ) number_of.sell++;
if ( OrderType ()== OP_SELLLIMIT ) number_of.sell_limit++;
if ( OrderType ()== OP_SELLSTOP ) number_of.sell_stop++;
}
}
}
//+------------------------------------------------------------------+
Genel olarak, bu, üzgünüm, tüyler ürpertici kodla ne yapmaya çalışıyorsunuz?
aşağıdakiler nasıl yazılır:
Fiyat %1 değiştiyse , günün AÇILIŞI, günün kapanışından %1 fazla diyelim.
aşağıdakiler nasıl yazılır:
Fiyat %1 değiştiyse, diyelim ki günün AÇILIŞI, günün Kapanış saatinden %1 fazla olsun.
Eh, bu başka bir konu, şimdi %1'in neye göre olduğu açık;)
EA, son X çubuğu için minimum ve maksimum hesaplar ve bunlara siparişler verir. Ayrıca, maksimum düşüş veya minimum artış olduğunda, ilgili siparişi silmeniz ve yeni verileri kullanarak açmanız gerekir.
Kurulum fiyatını değiştirip yeni seviyeye göre bir alımla durdurmak varken neden silesiniz? Ne de olsa, yalnızca mevcut değillerse ve piyasa pozisyonu yoksa mevduat ayarladınız. Bunun anlamı: piyasada bekleyen bir emir varsa ve buna karşılık gelen bir piyasa pozisyonu yoksa, o zaman sadece bekleyen emrin fiyatlarını - yeni bir seviyeye ayarlamanın fiyatını ve durdurma emirlerini - buna göre değiştirmeniz gerekir. yeni seviye.
Her seferinde, bulunan Max ve Min fiyatlarını hatırlayın. Mevcut bulunan Maks fiyat öncekinden düşükse, bekleyen BuyLimit'i değiştirir ve yeni Maks fiyatı saklarız. Min - ayna fiyatına.