Пишу индикаторы, советники, уже не бесплатно :) - страница 6

 
KimIV >>:
Неверные параметры функции. Проверьте, что именно Вы передаёте в функцию OrderClose().

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

 

Еще раз вечер добрый :)

С новой просьбой. Поняла, что все равно сама разобраться не смогу.

Прошу написать советник на основе индикатора WATR(код советника ниже). При повороте индикатора, закрывается открытый ордер(если он не был закрыт по SL или TP), и открывается новый ордер в ту сторону, в которую показывает индикатор. Ордер открывается только один именно в точке разворота. Далее ждем до следующего разворота советника.

Входные парамеры: размер лота, SL, TP,slippage. Вроде ничего не забыла :)

С уважением, Светлана. ICQ 320355718

Код индикатора:

//+------------------------------------------------------------------+
//| WATR.mq4 |
//| Written WizardSerg under article konkop in |
//| "Modern trading" #4/2001 |
//| http://www.wizardserg.inweb.ru |
//| wizardserg@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Written WizardSerg under article konkop in <Modern trading> #4/2001"
#property link "http://www.wizardserg.inweb.ru"
//----
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Coral
#property indicator_color2 DodgerBlue
//---- input parameters
extern int WATR_K = 10;
extern double WATR_M = 4.0;
extern int ATR = 21;
//---- buffers
double ExtMapBufferUp[];
double ExtMapBufferDown[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(2);
SetIndexBuffer(0, ExtMapBufferUp);
ArraySetAsSeries(ExtMapBufferUp, true);
SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
SetIndexBuffer(1, ExtMapBufferDown);
ArraySetAsSeries(ExtMapBufferDown, true);
SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2);
IndicatorShortName("WATR(" + WATR_K + ", " + WATR_M + ")");
SetIndexLabel(0, "WATR_Up");
SetIndexLabel(1, "WATR_Dn");
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator function |
//+------------------------------------------------------------------+
bool AntiTrendBar(int i)
{
bool res = (TrendUp(i) && (Close[i] < Open[i])) ||
(!TrendUp(i) && (Close[i] > Open[i]));
return(res);
}
//+------------------------------------------------------------------+
//| Custom indicator function |
//+------------------------------------------------------------------+
double CalcIndicValue(int i, bool trend)
{
double res = Close[i];
if(trend)
res -= (WATR_K*Point + WATR_M*iATR(NULL, 0, ATR, i));
else
res += (WATR_K*Point + WATR_M*iATR(NULL, 0, ATR, i));
return(res);
}
//+------------------------------------------------------------------+
//| Custom indicator function |
//+------------------------------------------------------------------+
bool TrendUp(int i)
{
return((Close[i+1] > ExtMapBufferUp[i+1]) &&
(ExtMapBufferUp[i+1] != EMPTY_VALUE));
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int limit;
int counted_bars = IndicatorCounted();
//---- последний посчитанный бар будет пересчитан
//---- первое значение индикатора == цене-1 point,
// то есть считает тренд восходящим
ExtMapBufferUp[Bars] = Close[Bars] - WATR_K*Point;
// limit = (counted_bars > 0) ? (Bars - counted_bars) : (Bars - 1);
limit = Bars - counted_bars;
//---- основной цикл
for(int i = limit; i >= 0; i--)
{
if(AntiTrendBar(i))
{
ExtMapBufferUp[i] = ExtMapBufferUp[i+1];
ExtMapBufferDown[i] = ExtMapBufferDown[i+1];
}
else
{
if(TrendUp(i))
{
ExtMapBufferUp[i] = CalcIndicValue(i, true);
if(ExtMapBufferUp[i] < ExtMapBufferUp[i+1])
ExtMapBufferUp[i] = ExtMapBufferUp[i+1];
ExtMapBufferDown[i] = EMPTY_VALUE;
}
else
{
ExtMapBufferDown[i] = CalcIndicValue(i, false);
if(ExtMapBufferDown[i] > ExtMapBufferDown[i+1])
ExtMapBufferDown[i] = ExtMapBufferDown[i+1];
ExtMapBufferUp[i] = EMPTY_VALUE;
}
}
// пересечения с ценой
if(TrendUp(i) && (Close[i] < ExtMapBufferUp[i]))
{
ExtMapBufferDown[i] = CalcIndicValue(i, false);
ExtMapBufferUp[i] = EMPTY_VALUE;
}
if((!TrendUp(i)) && (Close[i] > ExtMapBufferDown[i]))
{
ExtMapBufferUp[i] = CalcIndicValue(i, true);
ExtMapBufferDown[i] = EMPTY_VALUE;
}
}
return(0);
}
//+------------------------------------------------------------------+



 
rusmos писал(а) >>

Прошу извинения, но не могли-бы вы написать код, по примерно следующей задаче- первый лот наприм. 0.1, а каждый следующий увеличивается на определенную, заданную величину.

Заранее СПАСИБО

Ищите на этом форуме, такое уже спрашивали и писали...

В любом случае есть что-либо похожее...

 
StatBars >>:

Ищите на этом форуме, такое уже спрашивали и писали...

Спасибо .Вот уже часа три лопачу форум, много чего нашел, но тока не это (

 
StatBars >>:

Ищите на этом форуме, такое уже спрашивали и писали...

А код-то наверное срочек на 10 максимум.

Но тут наверное профи по мелочам не размениваются(

 
rusmos >>:

А код-то наверное срочек на 10 максимум.

Но тут наверное профи по мелочам не размениваются(

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

 
rusmos писал(а) >>

А код-то наверное срочек на 10 максимум.

Но тут наверное профи по мелочам не размениваются(

Вопрос нормально сформулируйте. Превый ордер, последующие. Первый от чего? От начала Уних эпохи, или со дня пришествия Христа, или момента сотворения мира, или может быть с того момета, как вы позавтракали и прогулялись? Какие вопросы, такие и ответы.

 
rusmos писал(а) >>

А код-то наверное срочек на 10 максимум.

Но тут наверное профи по мелочам не размениваются(

extern double RISK=20;


lotsize=MarketInfo(Symbol(),MODE_LOTSIZE)*0.01;
Balance=AccountBalance()*(RISK/100);
lots=NormalizeDouble(Balance/lotsize,2); // - это и есть лот для открытия позиции
Код не только увеличивает лот, но и уменьшает его, всё зависит от депо, депо растёт - лот увеличивается... Мне показалось Вам нужно это...
 
sol >>:

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

Ок. Первый лот Бай с лотом 0.1. В ответ сразу ставится СеллСтоп на 20 пунктов снизу с лотом 0.2 (т.е. увеличиваем на 0.1)

Далее, если сработал Селл в ответ ставим Байстоп с лотом 0,3(т.е. увеличиваем ПОСЛЕДНИЙ лот опять-же на 0,1) и в принципе так-далее.

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

Ну и соответственно интересны два варианта. Сложение и умножение.

Уф, вроде так)

 
StatBars >>:
Код не только увеличивает лот, но и уменьшает его, всё зависит от депо, депо растёт - лот увеличивается... Мне показалось Вам нужно это...

Размер депо не важен

Причина обращения: