Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Может кто-нибудь подсказать мне, что я сделал не так, нижеприведенный код 2 EMA пересекается с алертами. Он отказывается работать.Pls может кто-нибудь помочь скомпилировать и работать на mt4 build 600+:
#property copyright "wnk"
#property link "www.wnk.com"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
//--- буферы
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//внешняя переменная......
//+------------------------------------------------------------------+
//| Пользовательская функция инициализации индикатора |
//+------------------------------------------------------------------+
int init()
{
//---- индикаторы
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,217);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,217);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(1,0.0);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Пользовательская функция деинициализации индикатора |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Пользовательская функция итерации индикатора |
//+------------------------------------------------------------------+
int start()
{
static datetime LastAlertTime = TimeCurrent();
int counted_bars=IndicatorCounted(),
предел;
if(counted_bars<0)
return(-1);
if(counted_bars>0)
counted_bars--;
limit=Bars-counted_bars;
while(limit)
{
double ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);
double ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);
double b4ema13=iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,1);
double b4ema5=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1);
double mom=iMomentum(NULL,0,14,PRICE_CLOSE,0);
double b4mom=iMomentum(NULL,0,14,PRICE_CLOSE,1);
// обновление оповещений
if((LastAlertTime!=Time[0])&&(ema5>ema13)&&(ema5>b4ema5)&&(ema13>b4ema13)&&(mom>b4mom)&&(mom>98.6591))
ExtMapBuffer1[limit]=High[limit]+5*Point;
LastAlertTime = Time[0];
Alert(Symbol()," ",Period(), "M Price UP");
// алерт на продажу
if((LastAlertTime!=Time[0])&&(ema5<ema13)&&(ema5<b4ema5)&&(ema13<b4ema13)&&(mom<b4mom)&&(mom<100.6872))
ExtMapBuffer2[limit]=Low[limit]-5*Point;
LastAlertTime = Time[0];
Alert(Symbol()," ",Period(), "M Цена вниз");
}
return(0);
}
//+------------------------------------------------------------------+Mastercash
Попробуйте сейчас
Axel
Это можно сделать.
Просто открытые ордера должны быть просканированы на наличие нужного типа и их цены открытия должны быть сравнены с желаемой новой ценой открытия или бары, на которых они были открыты, могут быть сравнены с баром, который служит критерием для открытия.EDIT: Похоже, я забыл добавить функцию.
Можно ли написать функцию, подобную приведенной ниже, 20 раз или около того для разных "i=OrdersTotal()-1", а затем вызвать все функции и сопоставить их с новой ценой открытия?
double OpenOrderPrice()
{
double TempOrderPrice = 0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
TempOrderPrice = OrderOpenPrice();
}
}
return(TempOrderPrice);
}
EDIT: Похоже, я забыл добавить функцию.
Можно ли написать функцию, подобную приведенной ниже, 20 раз или около того для разных "i=OrdersTotal()-1", а затем вызвать все функции и сопоставить их с новой ценой открытия?
double OpenOrderPrice()
{
double TempOrderPrice = 0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
TempOrderPrice = OrderOpenPrice();
}
}
return(TempOrderPrice);
}Попробуйте что-то вроде этого :
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
BlackCoq
Вы должны передать цену, по которой он должен быть открыт, и максимальное отклонение ( абсолютное значение: например, не 5 для пяти пунктов, а 5*_пункт) от этой цены, и если разница меньше или равна этому отклонению, он вернет цену ордера, открытого по этой приблизительной цене. В противном случае он вернет -1 (что означает, что в этом случае ордеров с похожими ценами не существует).
Попробуйте что-то вроде этого:
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
BlackCoq
Вы должны передать цену, по которой он должен быть открыт, и максимальное отклонение (абсолютное значение: например, не 5 для пяти пунктов, а 5*_Point) от этой цены, и если разница меньше или равна этому отклонению, то возвращается цена ордера, открытого по этой приблизительной цене. В противном случае в результате будет возвращено -1 (что означает, что в этом случае ордеров с похожими ценами не существует).Итак, если я хочу проверить, есть ли открытые ордера, отклоняющиеся на 2 пункта от цены, по которой я хочу купить, я вызываю эту функцию:
double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation)
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
priceDeviation = 2*Point;
priceToCompareTo = Ask;
break;
}
}
return(TempOrderPrice);
}
А потом сделать еще один для шортов?
Итак, если я хочу проверить, есть ли открытые ордера, отклоняющиеся на 2 пункта от цены, по которой я хочу купить, я вызываю эту функцию:
double BuyOpenOrderPrice(double priceToCompareTo, double priceDeviation)
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
priceDeviation = 2*Point;
priceToCompareTo = Ask;
break;
}
}
return(TempOrderPrice);
}
А потом сделать еще один для шорт?Нет
Вы вызываете функцию следующим образом :
if (OpenOrderPrice(OP_BUY,Ask,2.0*_Point) == -1) разрешает лонги и
if (OpenOrderPrice(OP_SELL,Ask,2.0*_Point) == -1) разрешает шорты.
Вызов должен быть из вашей части кода, где у вас есть логика для открытия ордера.
Но тогда функция должна быть другой (как здесь):
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
Функция теперь покрывает оба случая, и вы не должны изменять код внутри функции.
___________________
PS: Переменная _Point не существует в старых сборках metatrader 4. Верхний пример написан для нового metatrader4. Если вы используете более старую сборку (509 или более раннюю), то "_Point" должна быть "Point".
Нет
Вы вызываете функцию следующим образом:
Вызов должен быть из вашей части кода, где у вас есть логика для открытия ордера.
Но тогда функция должна быть другой (как здесь):
Функция теперь охватывает оба случая, и вы не должны изменять код внутри функции.
___________________
PS: Переменная _Point не существует в старых сборках metatrader 4. Верхний пример написан для нового metatrader4. Если вы используете более старую сборку (509 или более раннюю), то "_Point" должно быть "Point".Спасибо. Я скопировал функцию в советник и вызвал ее, как вы написали, но почему-то она открывает позиции, хотя в пределах отклонения от новой цены есть и другие. Эта функция проверяет все открытые цены, или только последнюю?
В том числе и в советнике ниже.
//+------------------------------------------------------------------+
int start()
{
//----
bool result;
PipsUntilNextCandle--;
DisplayUserFeedback();
if (OldBars != Bars)
{
PipsUntilNextCandle = RenkoBoxSize;
OldBars = Bars;
DoesTradeExist();
double take;
double stop;
RefreshRates();
//Have the last candles risen , 1=last candle , 2 = last two candles
if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);
result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);
if (!result) OldBars = 0;
}
//if (Open[0] > Open[2])
//Have the last candles fallen , , 1=last candle , 2 = last two candles
if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);
result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);
if (!result) OldBars = 0;
}//if (Open[0] > Open[2])
}//if (OldBars != Bars)
//----Спасибо. Я скопировал функцию в советник и вызвал ее, как вы написали, но по какой-то причине он открывает позиции, даже если есть другие в пределах отклонения от новой цены. Эта функция проверяет все открытые цены, или только последнюю?
Включая советника, приведенного ниже.
//+------------------------------------------------------------------+
int start()
{
//----
bool result;
PipsUntilNextCandle--;
DisplayUserFeedback();
if (OldBars != Bars)
{
PipsUntilNextCandle = RenkoBoxSize;
OldBars = Bars;
DoesTradeExist();
double take;
double stop;
RefreshRates();
//Have the last candles risen , 1=last candle , 2 = last two candles
if (Open[0] > Open[CheckCandle] && (OpenOrderPrice(OP_BUY,Ask ,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Ask + (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Ask - (StopLoss * Point), Digits);
result = SendSingleTrade(OP_BUY, TradeComment, Lot, Ask, stop, take, MagicNumber);
if (!result) OldBars = 0;
}
//if (Open[0] > Open[2])
//Have the last candles fallen , , 1=last candle , 2 = last two candles
if (Open[0] < Open[CheckCandle] && (OpenOrderPrice(OP_SELL,Ask,20.0*Point) == -1))
{
if (TakeProfit > 0) take = NormalizeDouble(Bid - (TakeProfit * Point), Digits);
if (StopLoss > 0) stop = NormalizeDouble(Bid + (StopLoss * Point), Digits);
result = SendSingleTrade(OP_SELL, TradeComment, Lot, Bid, stop, take, MagicNumber);
if (!result) OldBars = 0;
}//if (Open[0] > Open[2])
}//if (OldBars != Bars)
//----В коде этой функции есть ошибка. Я предполагал, что OrderSelect() работает по позиции и не проверил это. Используйте этот вариант:
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
Теперь все должно работать правильно.
В коде этой функции есть ошибка. Я предполагал, что OrderSelect() работает по позиции и не проверил это. Используйте этот код:
{
double TempOrderPrice = -1;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderType()==orderType && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (MathAbs(OrderOpenPrice()-priceToCompareTo)<=priceDeviation)
TempOrderPrice = OrderOpenPrice();
break;
}
}
return(TempOrderPrice);
}
И так оно и есть. Еще раз спасибо за отличную работу, Младен.
Здравствуйте, Младен,
не могли бы вы взглянуть на этот код Я пытаюсь выбрать последний ордер и открыть дополнительные ордера на основе последней цены открытия. Все вроде бы работает, за исключением того, что
IfOrderDoesNotExist7(); IfOrderDoesNotExist5();
кажется, мешают друг другу, если я закомментирую один из них, как показано ниже, ордер будет работать нормально.
// IfOrderDoesNotExist7();
IfOrderDoesNotExist5();
подскажите, что я делаю не так.
Здравствуйте, Младен,
не могли бы вы взглянуть на этот код. Я пытаюсь выбрать последний ордер и открыть дополнительные ордера на основе цены последнего открытия. Все вроде бы работает, за исключением того, что
IfOrderDoesNotExist7(); IfOrderDoesNotExist5();
кажется, мешают друг другу, если я закомментирую один из них, как показано ниже, ордер будет работать нормально.
// IfOrderDoesNotExist7();
IfOrderDoesNotExist5();
не могли бы вы сказать мне, что я делаю неправильно.sulaimoney
Я думаю, что проблема была не в этих двух функциях, а в том, как новый metatrader 4 проверяет булевы условия (если вы использовали некоторые из новых сборок metatrader 4). Я немного упростил код и устранил одно место, где булевы условия должны быть строго определены. Попробуйте