Помощь в кодировании - страница 242

 
Mastercash:
Может кто-нибудь подсказать мне, что я сделал не так, нижеприведенный код 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

Попробуйте сейчас

Файлы:
_test_mc.mq4  3 kb
 
mladen:
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);

}

 
BlackCoq:
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 OpenOrderPrice(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();

break;

}

}

return(TempOrderPrice);

}

BlackCoq

Вы должны передать цену, по которой он должен быть открыт, и максимальное отклонение ( абсолютное значение: например, не 5 для пяти пунктов, а 5*_пункт) от этой цены, и если разница меньше или равна этому отклонению, он вернет цену ордера, открытого по этой приблизительной цене. В противном случае он вернет -1 (что означает, что в этом случае ордеров с похожими ценами не существует).

 
mladen:
Попробуйте что-то вроде этого:
double OpenOrderPrice(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();

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);

}

А потом сделать еще один для шортов?

 
BlackCoq:
Итак, если я хочу проверить, есть ли открытые ордера, отклоняющиеся на 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 OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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".

 
mladen:
Нет

Вы вызываете функцию следующим образом:

Вызов должен быть из вашей части кода, где у вас есть логика для открытия ордера.

Но тогда функция должна быть другой (как здесь):

Функция теперь охватывает оба случая, и вы не должны изменять код внутри функции.

___________________

PS: Переменная _Point не существует в старых сборках metatrader 4. Верхний пример написан для нового metatrader4. Если вы используете более старую сборку (509 или более раннюю), то "_Point" должно быть "Point".

Спасибо. Я скопировал функцию в советник и вызвал ее, как вы написали, но почему-то она открывает позиции, хотя в пределах отклонения от новой цены есть и другие. Эта функция проверяет все открытые цены, или только последнюю?

В том числе и в советнике ниже.

//+------------------------------------------------------------------+//| expert start function |

//+------------------------------------------------------------------+

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)

//----
 
BlackCoq:
Спасибо. Я скопировал функцию в советник и вызвал ее, как вы написали, но по какой-то причине он открывает позиции, даже если есть другие в пределах отклонения от новой цены. Эта функция проверяет все открытые цены, или только последнюю?

Включая советника, приведенного ниже.

//+------------------------------------------------------------------+//| expert start function |

//+------------------------------------------------------------------+

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 OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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);

}

Теперь все должно работать правильно.

 
mladen:
В коде этой функции есть ошибка. Я предполагал, что OrderSelect() работает по позиции и не проверил это. Используйте этот код:
double OpenOrderPrice(int orderType, double priceToCompareTo, double priceDeviation)

{

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();

подскажите, что я делаю не так.

Файлы:
564.mq4  10 kb
 
sulaimoney:
Здравствуйте, Младен,

не могли бы вы взглянуть на этот код. Я пытаюсь выбрать последний ордер и открыть дополнительные ордера на основе цены последнего открытия. Все вроде бы работает, за исключением того, что

IfOrderDoesNotExist7(); IfOrderDoesNotExist5();

кажется, мешают друг другу, если я закомментирую один из них, как показано ниже, ордер будет работать нормально.

// IfOrderDoesNotExist7();

IfOrderDoesNotExist5();

не могли бы вы сказать мне, что я делаю неправильно.

sulaimoney

Я думаю, что проблема была не в этих двух функциях, а в том, как новый metatrader 4 проверяет булевы условия (если вы использовали некоторые из новых сборок metatrader 4). Я немного упростил код и устранил одно место, где булевы условия должны быть строго определены. Попробуйте

Файлы:
564_1.mq4  10 kb
Причина обращения: