Я тоже так предполагаю. Но дальше-то что? Ни удалить ни модифицировать ордер не получается. И что, они будут висеть пожизненно? И не очень понятно что значит недостаточно лотов на демо .
Нет, это неверно. Выставить ордер можно где угодно в пределах текущих ограничений. Есть ограничение StopLevel. Т.е. выставить ордер получится не ближе к цене, чем значение StopLevel.
Влад, на какой бирже??? Видно-же демка какой конторы открыта...
Не могли бы Вы пояснить содержание этого комментария? А то я новичок в этом деле. Кстати, ткнул в кнопку Buy, ордер не исполнился, но отображается как.. как бы отложенный в окне Инструменты, а в чарте - нет.
User_mt5: Не могли бы Вы пояснить содержание этого комментария? А то я новичок в этом деле. Кстати, ткнул в кнопку Buy, ордер не исполнился, но отображается как.. как бы отложенный в окне Инструменты, а в чарте - нет.
А что пояснять? На скрине видно номер счёта и имя брокера который никакого отношения к бирже не имеет.
Alexey Viktorov: А что пояснять? На скрине видно номер счёта и имя брокера который никакого отношения к бирже не имеет.
Я не понимаю..
Если этот брокер не даст мне торговать по этому символу, то накой он включил его в список символов на демке? А если даст, то как понимать текущее положение дел с ордерами?
И вообще, вот если ордер исполнился частично (на 5-ке такое возможно), то какова судьба оставшегося ордера? Он должен быть закрыт или жить до ручного закрытия или до исполнения? Если это где-то написано, был бы крайне признателен за ссылку.
Если этот брокер не даст мне торговать по этому символу, то накой он включил его в список символов на демке? А если даст, то как понимать текущее положение дел с ордерами?
И вообще, вот если ордер исполнился частично (на 5-ке такое возможно), то какова судьба оставшегося ордера? Он должен быть закрыт или жить до ручного закрытия или до исполнения? Если это где-то написано, был бы крайне признателен за ссылку.
Не пытайтесь втянуть меня в обсуждение работы контор. Тем более что я порвал все отношения с этой, уже много лет назад и ничего о ней не знаю.
В OnTick() (работать рекомендуется только на новом баре, а не на каждом тике) объявляем два массива - в одном будут потом скопированы значения с быстрого MA, а во второй массив будут скопированы данные с медленного MA.
Копируем например 100 последних значений (то есть копировать нужно с индекса "0" и количество "100") с медленно MA и быстрого MA в эти массивы.
Переворачиваем массивы так, чтобы индекс #0 в массивах соответствовал самому правому бару на графике.
Теперь остаётся в цикле от "0" до "100-1" пройтись по обоим массивам и искать пересечение. Когда найдём пересечение, то значение переменной цикла как раз и будет номером бара.
Примечание: в этом алгоритме не учтены никакие проверки и защиты от ошибок.
Спасибо, как написать цикл поиска номера бара пересечения двух МА когда первые два пункта алгоритма выполнены и есть значения двух МА на первом баре?
MA1_1=iMAGet(handle_iMA_1, 1); // значение 1-й МА
MA2_1=iMAGet(handle_iMA_2, 1); // значение 2-й МА
/
double iMAGet(constint handle,constint index)
{
double MA[];
ArraySetAsSeries(MA,true);
//--- reset error code ResetLastError();
//--- fill a part of the iMABuffer array with values from the indicator buffer that has 0 index if(CopyBuffer(handle,0,0,index+1,MA)<0)
{
//--- if the copying fails, tell the error code PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());
//--- quit with zero result - it means that the indicator is considered as not calculated return(0.0);
}
return(MA[index]);
}
Спасибо, как написать цикл поиска номера бара пересечения двух МА когда первые два пункта алгоритма выполнены и есть значения двух МА на первом баре?
/
.
Ага, Вы решили всё таки не через массивы.
Примечание: решение через массивы (копирование в массивы First[], Second[] и Third[] ПОСЛЕДНИХ ТРЁХ значений с индикаторов) - Crossing of two iMA - OnTick():
//--- We look for crossing of two indicatorsdouble First[];
double Second[];
double Third[];
ArraySetAsSeries(First,true); // index [0] - the most right bar on a chartsArraySetAsSeries(Second,true); // index [0] - the most right bar on a chartsArraySetAsSeries(Third,true); // index [0] - the most right bar on a chartsint buffer_num=0; // indicator buffer number int start_pos=0; // start position int count=3; // amount to copy if(!iMAGet(handle_iMA_First,buffer_num,start_pos,count,First))
return;
if(!iMAGet(handle_iMA_Second,buffer_num,start_pos,count,Second))
return;
if(InpFilterMA)
if(!iMAGet(handle_iMA_Third,buffer_num,start_pos,count,Third))
return;
//--- step 1: check in the arrays bars [0] and [1]if(First[0]>Second[0] && First[1]<Second[1]) // buy
{
if(InpFilterMA)
if(Third[0]>=First[0])
return;
if(!RefreshRates())
{
PrevBars=iTime(1);
return;
}
double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
OpenBuy(sl,tp);
return;
}
elseif(First[0]<Second[0] && First[1]>Second[1]) // sell
{
if(InpFilterMA)
if(Third[0]<=First[0])
return;
if(!RefreshRates())
{
PrevBars=iTime(1);
return;
}
double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
OpenSell(sl,tp);
return;
}
//--- step 2: on a step of 1 crossing haven't found. check in the arrays bars [0] and [2]if(First[0]>Second[0] && First[2]<Second[2]) // buy
{
//--- search in historyif(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
return;
if(!RefreshRates())
{
PrevBars=iTime(1);
return;
}
double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
OpenBuy(sl,tp);
return;
}
elseif(First[0]<Second[2] && First[1]>Second[2]) // sell
{
//--- search in historyif(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
return;
if(!RefreshRates())
{
PrevBars=iTime(1);
return;
}
double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
OpenSell(sl,tp);
return;
}
В Вашем случае (получение по одному значению) цикл будет выглядеть примерно так:
int signal=0; // "-1" -> Sell; "0" -> Not signal; "1" -> Buydouble MA1_curr=iMAGet(handle_iMA_1,0); // the value of the 1st MA on i bardouble MA2_curr=iMAGet(handle_iMA_2,0); // the value of the 1st MA on i barfor(int i=0;i<100;i++)
{
double MA1_prev=iMAGet(handle_iMA_1,i+1); // the value of the 1st MA on i+1 th bardouble MA2_prev=iMAGet(handle_iMA_2,i+1); // the value of the 1st MA on i+1 th bar//---
signal=0; // "-1" -> Sell; "0" -> Not signal; "1" -> Buyif(MA1_prev<MA2_prev && MA1_curr>MA2_curr)
signal=1;
elseif(MA1_prev>MA2_prev && MA1_curr<MA2_curr)
signal=-1;
//---
MA1_curr=MA1_prev;
MA2_curr=MA2_prev;
}
MA1_curr - значение индикатора MA1 на баре #i, MA1_prev - значение индикатора MA1 на баре #i+1 MA2_curr - значение индикатора MA2 на баре #i, MA2_prev - значение индикатора MA2 на баре #i+1
Когда получаете пересечение (переменная signal равна или "-1" или "1") - значение i и будет номером бара на котором произошло пересечение.
Это самый простой алгоритм поиска пересечения, но не самый точный.
Я тоже так предполагаю. Но дальше-то что? Ни удалить ни модифицировать ордер не получается. И что, они будут висеть пожизненно?
И не очень понятно что значит недостаточно лотов на демо .
Нет, это неверно. Выставить ордер можно где угодно в пределах текущих ограничений. Есть ограничение StopLevel. Т.е. выставить ордер получится не ближе к цене, чем значение StopLevel.
Но если сервер принял, значит всё в порядке.
там на бирже немного по другому...
там на бирже немного по другому...
Влад, на какой бирже??? Видно-же демка какой конторы открыта...
Влад, на какой бирже??? Видно-же демка какой конторы открыта...
я имел ввиду на фьючерсах. хотя нет, что-то я запутался. не обращайте внимания. я сейчас под таблетками.
Влад, на какой бирже??? Видно-же демка какой конторы открыта...
Кстати, ткнул в кнопку Buy, ордер не исполнился, но отображается как.. как бы отложенный в окне Инструменты, а в чарте - нет.
Не могли бы Вы пояснить содержание этого комментария? А то я новичок в этом деле.
Кстати, ткнул в кнопку Buy, ордер не исполнился, но отображается как.. как бы отложенный в окне Инструменты, а в чарте - нет.
А что пояснять? На скрине видно номер счёта и имя брокера который никакого отношения к бирже не имеет.
Я не понимаю..
Если этот брокер не даст мне торговать по этому символу, то накой он включил его в список символов на демке?
А если даст, то как понимать текущее положение дел с ордерами?
И вообще, вот если ордер исполнился частично (на 5-ке такое возможно), то какова судьба оставшегося ордера?
Он должен быть закрыт или жить до ручного закрытия или до исполнения?
Если это где-то написано, был бы крайне признателен за ссылку.
Я не понимаю..
Если этот брокер не даст мне торговать по этому символу, то накой он включил его в список символов на демке?
А если даст, то как понимать текущее положение дел с ордерами?
И вообще, вот если ордер исполнился частично (на 5-ке такое возможно), то какова судьба оставшегося ордера?
Он должен быть закрыт или жить до ручного закрытия или до исполнения?
Если это где-то написано, был бы крайне признателен за ссылку.
Не пытайтесь втянуть меня в обсуждение работы контор. Тем более что я порвал все отношения с этой, уже много лет назад и ничего о ней не знаю.
Примерный алгоритм:
Спасибо, как написать цикл поиска номера бара пересечения двух МА когда первые два пункта алгоритма выполнены и есть значения двух МА на первом баре?
/
.
Спасибо, как написать цикл поиска номера бара пересечения двух МА когда первые два пункта алгоритма выполнены и есть значения двух МА на первом баре?
/
.
Ага, Вы решили всё таки не через массивы.
Примечание: решение через массивы (копирование в массивы First[], Second[] и Third[] ПОСЛЕДНИХ ТРЁХ значений с индикаторов) - Crossing of two iMA - OnTick():
В Вашем случае (получение по одному значению) цикл будет выглядеть примерно так:
MA1_curr - значение индикатора MA1 на баре #i, MA1_prev - значение индикатора MA1 на баре #i+1
MA2_curr - значение индикатора MA2 на баре #i, MA2_prev - значение индикатора MA2 на баре #i+1
Когда получаете пересечение (переменная signal равна или "-1" или "1") - значение i и будет номером бара на котором произошло пересечение.
Это самый простой алгоритм поиска пересечения, но не самый точный.
Ага, Вы решили всё таки не через массивы...
Спасибо, в качестве примера был взят другой ваш советник MA Cross
В нём и хочу сделать вход на третьем или на пятом или...n баре после пересечения
В Вашем случае (получение по одному значению) цикл будет выглядеть примерно так:
Почему нет выхода из цикла, когда пересечение найдено?
Эти условия можно поставить за пределами цикла?
.