Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 33
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Добрый. Подскажите, где ошибка?
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 (неправильные стопы). Что я делаю не так?
При установке отложенного ордера цена открытия не может быть слишком близкой к рынку. Минимальное расстояние отложенной цены от текущей рыночной цены в пунктах также можно получить, используя функцию MarketInfo() с параметром MODE_STOPLEVEL. В случае неправильной цены открытия отложенного ордера будет сгенерирована ошибка 130 (ERR_INVALID_STOPS).
Нет, не в этом дело, зазор там есть. Тем более так-же пытался изменить отложенный на покупку, на том-же графике тестировал, те-же ошибки.
Зазор зазором, но ты видно не дочитал то что написано
....... В случае неправильной цены открытия отложенного ордера будет сгенерирована ошибка 130 (ERR_INVALID_STOPS)..........
т. е. Пытаешся установить OP_SELLLIMIT ниже рыночной цены.
Зазор зазором, но ты видно не дочитал то что написано
....... В случае неправильной цены открытия отложенного ордера будет сгенерирована ошибка 130 (ERR_INVALID_STOPS)..........
т. е. Пытаешся установить OP_SELLLIMIT ниже рыночной цены.
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;} // бай стоп
В чем тут ошибка ..Открытые сделки закрываются сами по себе сигнала обратоого нет ..
if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // бай стоп
В чем тут ошибка ..Открытые сделки закрываются сами по себе сигнала обратоого нет ..
На нулевом баре сигнал "мерцает", что пост-фактум не видно. В тестере на всех тиках визуализацию прогоните, вопросы исчезнут.
проблема не в этом .При срабатывании ордера открывается сделка и она сразу закрывается при появлнии новой свечи и при этом обратного сигнала нет ..Я поэтому привел кусок кода закрытия сделок .По коду вроде как должны дождаться нового сигнала
Здравствуйте.
Подскажите, что неправильно.
Значок должен устанавливаться если линия индикатора пересекла уровень 20, на периоде М1, и линия индикатора находится выше уровня 50, на периоде М5.
Почему-то значок ставится, даже если линия на М5 находится ниже заданного уровня 50.
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);
}
Здравствуйте.
Подскажите, что неправильно.
Значок должен устанавливаться если линия индикатора пересекла уровень 20, на периоде М1, и линия индикатора находится выше уровня 50, на периоде М5.
Почему-то значок ставится, даже если линия на М5 находится ниже заданного уровня 50.
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);
}
Странный у вас цикл. Непривычный какой-то.
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--) {
// основной цикл индикатора
}
//+------------------------------------------------------------------+
Почему limit проверяем на больше 1. Например загрузилась история, и разница будет больше одного. Если все нормально, то разница rates_total-prev_calculated равна или 0, или 1
0 - пришел новый тик, новый бар формироваться не начал.
1 - пришел новый тик и начал формироваться новый бар
Покажите весь ваш индикатор - глянем что там не так.