There you go, that's different, now it's clear what the 1% is in relation to ;)
if(Open[x] > Close[x]+Open[x]*0.01) {code}
You can't understand the language. You need 10 lines to write two words, then you need only two to write 10 words... You'd think programming would be fine and then it would be a mess in the end.)
spoiltboy: The Expert Advisor considers min and max values of the last X bars and places orders by them. Then, when maximum or minimum is decreased, you should delete the corresponding order and open by new data.
Didn't understand exactly when you modify the pauses, but made it so that if the minimum price is higher than the existing BuyLimit setting price, then you need to modify it to the new Min price.
For SellLimit - mirrored.
I have only written the code, but haven't checked it at all - I leave it to you to modify and check the correctness of the algorithm and the code in general.
//--- input variables inputdouble LotB=0.1; // Лот Buy inputdouble LotS=0.1; // Лот Sell inputint Pointsl=100; // StopLoss в пунктах inputint Pointtp=100; // TakeProfit в пунктах inputint NumBars=10; // Количество баров для поиска Max/Min inputint Magic=100500; // Magic
//--- global variables struct DataPendingOrder { int number; // Количество double price_set; // Цена установки };
//--- если нету рыночных Buy if(getData.buy==0) { //--- если нет отложенного BuyLimit if(getData.order.buy_limit.number==0) { double slB=(pointsl==0?0:NormalizeDouble(minPrice-pointsl*Point(),Digits())); double tpB=(pointtp==0?0:NormalizeDouble(minPrice+pointtp*Point(),Digits())); ResetLastError(); int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minPrice, 3, slB, tpB, "", Magic, 0, clrRed); if(ticketUP==-1) Print("ERROR SETTING OP_BUYLIMIT :",GetLastError()); elsePrint("OP_BUYLIMIT OK"); } //--- если есть BuyLimit else { //--- если цена Min больше цены установки BuyLimit if(minPrice>getData.order.buy_limit.price_set) { // модифицировать BuyLimit - поставить его на цену minPrice ... //--- ... и сместить его стоп-уровни относительно новой цены установки } } }
//--- если нету рыночных Sell if(getData.sell==0) { //--- если нет отложенного SellLimit if(getData.order.sell_limit.number==0) { double slS=(pointsl==0?0:NormalizeDouble(maxPrice+pointsl*Point(),Digits())); double tpS=(pointtp==0?0:NormalizeDouble(maxPrice-pointtp*Point(),Digits())); ResetLastError(); int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxPrice, 3, slS, tpS, "", Magic, 0, clrBlue); if(ticketD==-1) Print("ERROR SETTING OP_SELLLIMIT :",GetLastError()); elsePrint("OP_SELLLIMIT OK"); } //--- если есть SellLimit else { //--- если цена Max меньше цены установки SellLimit if(maxPrice<getData.order.sell_limit.price_set) { // модифицировать SellLimit - поставить его на цену maxPrice ... //--- ... и сместить его стоп-уровни относительно новой цены установки } } }
Anybody want to know what the extern reset command should look like?
how it should look like
1) Select a set of required conditions from the list for the command to trigger, e.g., open an order
2) The order is opened and the command does not work under any other conditions. The filtering by ticket and order quantity is not an option since the principle itself should be spread throughout the list.
if (MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Distanse*Point() ) What is the error here if GrossMA1[0], MA1[0] GrossMA2[1] MA2[1] use moving intersection + filter on distance after moving intersection. How accurate is this condition?
Movlat Baghiyev: if (MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Distanse*Point() ) What is the error here if GrossMA1[0], MA1[0] GrossMA2[1] MA2[1] use moving intersection + filter by distance after moving intersection. How accurate is this condition?
WhatGrossMA1 andGrossMA2 return you, there is probably a difference there, you end up with something like this
MA1= 1.0050
if (MA1 > 0.0052) // it is not the price itself but its difference, so it is not an incorrect comparison
Allow the use of cookies to log in to the MQL5.com website.
Please enable the necessary setting in your browser, otherwise you will not be able to log in.
You are signed in. Two-factor authentication has been disabled. Set it up again and scan a new QR code, or continue with two-factor authentication disabled.
There you go, that's different, now it's clear what the 1% is in relation to ;)
The Expert Advisor considers min and max values of the last X bars and places orders by them. Then, when maximum or minimum is decreased, you should delete the corresponding order and open by new data.
Didn't understand exactly when you modify the pauses, but made it so that if the minimum price is higher than the existing BuyLimit setting price, then you need to modify it to the new Min price.
For SellLimit - mirrored.
I have only written the code, but haven't checked it at all - I leave it to you to modify and check the correctness of the algorithm and the code in general.
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 DataPendingOrder
{
int number; // Количество
double price_set; // Цена установки
};
struct DataPending
{
DataPendingOrder buy_limit; // BuyLimit
DataPendingOrder buy_stop; // BuyStop
DataPendingOrder sell_limit; // SellLimit
DataPendingOrder sell_stop; // SellStop
};
struct DataOrders
{
int buy; // Количество позиций Buy
int sell; // Количество позиций Sell
DataPending order; // Данные отложенного ордера
};
DataOrders getData; // Данные ордеров и позиций
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,getData);
//--- найдём максимальную и минимальную цены за bars свечей
double maxPrice=0.0, 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;
}
//--- если нету рыночных Buy
if(getData.buy==0) {
//--- если нет отложенного BuyLimit
if(getData.order.buy_limit.number==0) {
double slB=(pointsl==0?0:NormalizeDouble(minPrice-pointsl*Point(),Digits()));
double tpB=(pointtp==0?0:NormalizeDouble(minPrice+pointtp*Point(),Digits()));
ResetLastError();
int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minPrice, 3, slB, tpB, "", Magic, 0, clrRed);
if(ticketUP==-1) Print("ERROR SETTING OP_BUYLIMIT :",GetLastError());
else Print("OP_BUYLIMIT OK");
}
//--- если есть BuyLimit
else {
//--- если цена Min больше цены установки BuyLimit
if(minPrice>getData.order.buy_limit.price_set) {
// модифицировать BuyLimit - поставить его на цену minPrice ...
//--- ... и сместить его стоп-уровни относительно новой цены установки
}
}
}
//--- если нету рыночных Sell
if(getData.sell==0) {
//--- если нет отложенного SellLimit
if(getData.order.sell_limit.number==0) {
double slS=(pointsl==0?0:NormalizeDouble(maxPrice+pointsl*Point(),Digits()));
double tpS=(pointtp==0?0:NormalizeDouble(maxPrice-pointtp*Point(),Digits()));
ResetLastError();
int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxPrice, 3, slS, tpS, "", Magic, 0, clrBlue);
if(ticketD==-1) Print("ERROR SETTING OP_SELLLIMIT :",GetLastError());
else Print("OP_SELLLIMIT OK");
}
//--- если есть SellLimit
else {
//--- если цена Max меньше цены установки SellLimit
if(maxPrice<getData.order.sell_limit.price_set) {
// модифицировать SellLimit - поставить его на цену maxPrice ...
//--- ... и сместить его стоп-уровни относительно новой цены установки
}
}
}
//---
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, DataOrders &data_of) {
ZeroMemory(data_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) data_of.buy++;
if(OrderType()==OP_SELL) data_of.sell++;
//--- отложенные ордера
if(OrderType()==OP_BUYLIMIT) { data_of.order.buy_limit.number++; data_of.order.buy_limit.price_set=OrderOpenPrice(); }
if(OrderType()==OP_BUYSTOP) { data_of.order.buy_stop.number++; data_of.order.buy_stop.price_set=OrderOpenPrice(); }
if(OrderType()==OP_SELLLIMIT) { data_of.order.sell_limit.number++; data_of.order.sell_limit.price_set=OrderOpenPrice(); }
if(OrderType()==OP_SELLSTOP) { data_of.order.sell_stop.number++; data_of.order.sell_stop.price_set=OrderOpenPrice(); }
}
}
}
//+------------------------------------------------------------------+
I hope you will figure it out
Why delete when you can modify the setting price and stop and takeout relative to the new level?
I've just started studying and the deletion option was to study the application of the function, I wondered why it didn't work.
Thank you all for your feedback.
Anybody want to know what the extern reset command should look like?
how it should look like
1) Select a set of required conditions from the list for the command to trigger, e.g., open an order
2) The order is opened and the command does not work under any other conditions. The filtering by ticket and order quantity is not an option since the principle itself should be spread throughout the list.
if (MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Distanse*Point() ) What is the error here if GrossMA1[0], MA1[0] GrossMA2[1] MA2[1] use moving intersection + filter by distance after moving intersection. How accurate is this condition?
WhatGrossMA1 andGrossMA2 return you, there is probably a difference there, you end up with something like this
MA1= 1.0050
if (MA1 > 0.0052) // it is not the price itself but its difference, so it is not an incorrect comparison
WhatGrossMA1 andGrossMA2 return you, there is most likely a difference there, you end up with something like this
MA1= 1.0050
if (MA1 > 0.0052) // that is, not the price itself, but its difference, so it is an incorrect comparison
WhatGrossMA1 andGrossMA2 return you, there is most likely a difference there, you end up with something like this
MA1= 1.0050
if (MA1 > 0.0052) // that is, not the price itself, but its difference, so it is an incorrect comparison
FRMA2=iMA(Symbol(), 0, Faster_MA_Period, Faster_MA_Shift, Faster_MA_method, Faster_MA_Apply_to, 1);
FMA1=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 0);
FMA2=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 1);
GrossMA1=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 0);
GrossMA2=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 1);
WhatGrossMA1 andGrossMA2 return you, there is probably a difference there, you end up with something like this
MA1= 1.0050
if (MA1 > 0.0052) // that is, not the price itself, but its difference, so it is an incorrect comparison
Good. Can you tell me where the error is?
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");
}
Everything works, places an order at the price of maxpr1.
Then I want to do the same, but at minpr1 price:
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");
}
Error 130 (wrong stops). What am I doing wrong?