Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 32
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ну вот, другое дело, теперь понятно, относительно чего 1% ;)
Советник считает min и max за последние Х бар и выставляет по ним ордера. Далее, при уменьшении максимума или увеличении минимума нужно удалить соотв ордер и открыть по новым данным.
Не понял точно когда вы модифицируете отложки, но сделал так, что если минимальная цена выше цены установки существующего BuyLimit, то нужно его модифицировать на новую цену Min
Для SellLimit - зеркально.
А уж верно это, или нет - вам лучше знать - проверяйте и правьте ежли что - я только код написал, но не проверял его вообще - вам оставлю дописать модификацию и проверку верности работы алгоритма и кода в общем.
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(); }
}
}
}
//+------------------------------------------------------------------+
надеюсь, разберётесь
Зачем удалять, если можно модифицировать цену установки и стоп с тейком относительно нового уровня?
Я вот только начал изучение и вариант с удалением был с целью изучения применения функции, встал вопрос почему не работает.
Спасибо всем что откликаетесь.
Кто подскажет как должна выглядеть команда сброса extern-параметров
как это должно выглядеть
1) выбирается в списке набор нужных условий для срабатывания команды, допустим открытие ордера
2) Открывается ордер и больше эта команда не работает ни при каких условиях. Фильтр по тикету и количеству ордеров не вариант, так как сам принцип надо раскидать по всему списку.
if (MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Distanse*Point() ) в чем тут ошибка ,если GrossMA1[0]. MA1[0] GrossMA2[1] MA2[1].Используется пересечение мувингов + фильтр по дистанции после пересечения мувингов. На сколько прописано верно это условие ?
Что вас возвращает GrossMA1 и GrossMA2, там скорее всего разница, в итоге у вас получается примерно так:
MA1 = 1.0050
if (MA1 > 0.0052) // то есть, не сама цена, а её разница, поэтому неправильное сравнение
Что вас возвращает GrossMA1 и GrossMA2, там скорее всего разница, в итоге у вас получается примерно так:
MA1 = 1.0050
if (MA1 > 0.0052) // то есть, не сама цена, а её разница, поэтому неправильное сравнение
Что вас возвращает GrossMA1 и GrossMA2, там скорее всего разница, в итоге у вас получается примерно так:
MA1 = 1.0050
if (MA1 > 0.0052) // то есть, не сама цена, а её разница, поэтому неправильное сравнение
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);
Что вас возвращает GrossMA1 и GrossMA2, там скорее всего разница, в итоге у вас получается примерно так:
MA1 = 1.0050
if (MA1 > 0.0052) // то есть, не сама цена, а её разница, поэтому неправильное сравнение
Добрый. Подскажите, где ошибка?
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");
}
Все работает, выставляет ордер по цене maxpr1.
Далее я хочу проделать то-же самое, но по цене minpr1:
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 (неправильные стопы). Что я делаю не так?