eevviill
Заблокирован
Давай кокретный пример. Разберём.Хочу добавить, что алерт должен брать откуда-то сигнал, как правило если просто прописать сточку Alert(); не там, он будет сигналить постоянно, в лучшем случае молчать.
Давай кокретный пример. Разберём.Хочу добавить, что алерт должен брать откуда-то сигнал, как правило если просто прописать сточку Alert(); не там, он будет сигналить постоянно, в лучшем случае молчать.
Давай кокретный пример. Разберём.
Я не селен в программировании но заметил один программист на этом форуме добавляет один и тотже код алерта единственное различие которое я заметил это в этих строчках
if (g_ibuf_100[Signal_Bar]!= EMPTY_VALUE && g_ibuf_100[Signal_Bar+1] == EMPTY_VALUE)
if (Buffer1[Signal_Bar]!= EMPTY_VALUE && Buffer1[Signal_Bar+1] == EMPTY_VALUE)
Весь код выкладывать не буду, я не автор и может ему это не понравится.
При чём здесь то что ты выложил к Alert?Я не селен в программировании но заметил один программист на этом форуме добавляет один и тотже код алерта единственное различие которое я заметил это в этих строчках
if (g_ibuf_100[Signal_Bar]!= EMPTY_VALUE && g_ibuf_100[Signal_Bar+1] == EMPTY_VALUE)
if (Buffer1[Signal_Bar]!= EMPTY_VALUE && Buffer1[Signal_Bar+1] == EMPTY_VALUE)
Весь код выкладывать не буду, я не автор и может ему это не понравится.
double MA1 = iMA(Symbol(),0,60,0,MODE_LWMA,PRICE_CLOSE,1);
double MA2 = iMA(Symbol(),0,60,0,MODE_LWMA,PRICE_CLOSE,2);
if((MA2>Close[2]) && MA1<Close[1]) Alert("MA under Price");
double MA1 = iMA(Symbol(),0,60,0,MODE_LWMA,PRICE_CLOSE,1);
double MA2 = iMA(Symbol(),0,60,0,MODE_LWMA,PRICE_CLOSE,2);
int sig = 1;
if((MA2>Close[2]) && MA1<Close[1]) sig = 2;
Alert(sig);
Он наверно имел в виду этот код.При чём здесь то что ты выложил к Alert?
static int PrevSignal = 0;
static datetime PrevTime = 0;
if(Signal_Bar > 1 && Time[0] <= PrevTime )
return(0);
PrevTime = Time[0];
if(PrevSignal <= 0 || !A_EM)
{
if (ibuf_84[Signal_Bar]!= EMPTY_VALUE && ibuf_84[Signal_Bar+1] == EMPTY_VALUE)
{
PrevSignal = 1;
Alert("SkdonТrend ",Period()," ",Symbol()," BUY");
}
}
Да я и имею ввиду что отличаютсяОн наверно имел в виду этот код.
PHP:static int PrevSignal = 0; static datetime PrevTime = 0; if(Signal_Bar > 1 && Time[0] <= PrevTime ) return(0); PrevTime = Time[0]; if(PrevSignal <= 0 || !A_EM) { if (ibuf_84[Signal_Bar]!= EMPTY_VALUE && ibuf_84[Signal_Bar+1] == EMPTY_VALUE) { PrevSignal = 1; Alert("SkdonТrend ",Period()," ",Symbol()," BUY"); } }
Да я и имею ввиду что отличаются
if (ibuf_84[Signal_Bar]!= EMPTY_VALUE && ibuf_84[Signal_Bar+1] == EMPTY_VALUE)
авот с другого индикатора
if (g_ibuf_100[Signal_Bar]!= EMPTY_VALUE && g_ibuf_100[Signal_Bar+1] == EMPTY_VALUE)
А как понять что надо брать из SetIndexBuffer ведь их там много бывает разных?
Заранее спасибо.
Есть 2 варианта
1 Ознакомится с этим _http://docs.mql4.com/ru/customind и отпадут многие вопросы.
2 Методом научного тыка.
Сегодня будем перебирать ордера. Для чего это нужно?
Для всего что связано с операциями по ордерам кроме открытия.
Тоесть сначало надо ордер выбрать чтобы потом модифицировать, закрыть, удалить его.
Пример.
PHP:1)for(int i=OrdersTotal()+1; i>=0; i--) { 2)OrderSelect(i,SELECT_BY_POS); { 3)if(OrderMagicNumber()==magic) { 4)if(OrderType()==OP_BUY...) OrderClose(OrderTicket(),Lot,Bid,slippage,Yellow); } } }
1)Собственно это и есть перебор ордеров функцией for.
1.1)Начинаем с общего количества ордеров+1.
1.2)Будем продолжать пока ордеров будет 0 или больше.
1.3)На каждом переборе будем уменьшать количество перебираемых ордеров на 1.
2)Функция OrderSelect(); С помощью неё мы выбираем конкретный ордер. В нашем слачае (порядковый номер в терминале i, из тех что находятся в закладке торговля).
3)После того как выбрали ордер проверяем или это ордер нашего советника. Проверку делаем с помощью меджик намбера, который должен совпадать с меджиком открытого ордера.
4)Здесь уже проводятся конкретные действия. Например если ордер бай и
цена пересекла МА сверху вниз закрываем ордер.
И что выйдет? Допустим у нас всего 6 ордеров. По твоей схеме мы начинаем перебирать с 5-го. Так как мы идём от конца к началу, то выйдет что мы 6-ой ордер не перебрали.Добрый день!
Лучше, наверное, брать со знаком "минус":
OrdersTotal()-1. :question:
И что выйдет? Допустим у нас всего 6 ордеров. По твоей схеме мы начинаем перебирать с 5-го. Так как мы идём от конца к началу, то выйдет что мы 6-ой ордер не перебрали.
Сегодня будем перебирать ордера. Для чего это нужно?
Для всего что связано с операциями по ордерам кроме открытия.
Тоесть сначало надо ордер выбрать чтобы потом модифицировать, закрыть, удалить его.
Пример.
PHP:1)for(int i=OrdersTotal()+1; i>=0; i--) { 2)OrderSelect(i,SELECT_BY_POS); { 3)if(OrderMagicNumber()==magic) { 4)if(OrderType()==OP_BUY...) OrderClose(OrderTicket(),Lot,Bid,slippage,Yellow); } } }
1)Собственно это и есть перебор ордеров функцией for.
1.1)Начинаем с общего количества ордеров+1.
1.2)Будем продолжать пока ордеров будет 0 или больше.
1.3)На каждом переборе будем уменьшать количество перебираемых ордеров на 1.
2)Функция OrderSelect(); С помощью неё мы выбираем конкретный ордер. В нашем слачае (порядковый номер в терминале i, из тех что находятся в закладке торговля).
3)После того как выбрали ордер проверяем или это ордер нашего советника. Проверку делаем с помощью меджик намбера, который должен совпадать с меджиком открытого ордера.
4)Здесь уже проводятся конкретные действия. Например если ордер бай и
цена пересекла МА сверху вниз закрываем ордер.
Добрый день. Сегодня мы сделаем скрипт котрый будет закрывать ордера.
............................
#property copyright "eevviill"
#property show_inputs
extern string TO = "??? ?????? ??? ????????";
extern bool Buy = false;
extern bool Sell = false;
extern bool BuyStop = false;
extern bool SellStop = false;
extern bool BuyLimit = false;
extern bool SellLimit = false;
extern bool Close_all_lots = true;
extern double Close_lot = 0.1;
double Lot;
extern int Magic = 0;
extern int Slippage = 4;
int start()
{
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS)){
if(Close_all_lots==true) Lot=OrderLots();
if(Close_all_lots==false) Lot=Close_lot;
if(OrderMagicNumber()== Magic && OrderType()==OP_BUY && Buy==true) OrderClose(OrderTicket(),Lot,Bid,Slippage,Yellow);
if(OrderMagicNumber()== Magic && OrderType()==OP_SELL && Sell==true) OrderClose(OrderTicket(),Lot,Ask,Slippage,Yellow);
if( OrderMagicNumber()== Magic && OrderType()==OP_BUYSTOP && BuyStop==true) OrderDelete(OrderTicket());
if( OrderMagicNumber()== Magic && OrderType()==OP_SELLSTOP && SellStop==true) OrderDelete(OrderTicket());
if(OrderMagicNumber()== Magic && OrderType()==OP_BUYLIMIT && BuyLimit==true) OrderDelete(OrderTicket());
if( OrderMagicNumber()== Magic && OrderType()==OP_SELLLIMIT && SellLimit==true) OrderDelete(OrderTicket());
}
}
return(0);
}
Подскажите , пожалуйста, как можно среди всех открытых ордеров выделить наибольший лот (его чисовое значение), в виде примера, если можно.
int total=OrdersTotal();
double MaximumLot=0;
for(int p=0; p<total; p++)
{
OrderSelect(p, SELECT_BY_POS, MODE_TRADES);
MaximumLot=MathMax(MaximumLot,OrderLots());
}
int magic = 0;
double lot;
double max_lot = 0;
int start()
{
for(int i=OrdersTotal()+1; i>=0; i--)
{
OrderSelect(i,SELECT_BY_POS);
{
if(OrderMagicNumber()==magic)
{
lot=OrderLots();
1)if(lot>max_lot) max_lot=lot;
}
}
}
Alert(max_lot);
return(0);
}
По многочисленым заявкам сегодня будем искать величину наибольшей открытой позиции.
Ну нравится человеку сначала выбрать 2 не существующих ордера прежде чем перейти к существующему, чё такого.почему у Вас всегда OrdersTotal()+1;
Надо писать OrdersTotal()-1;Запомните это как библию
или же при i=0 просто OrdersTotal()