Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 135
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вы подставляете сразу цены, или их получаете и потом подставляете в расчёт?
Вы подставляете сразу цены, или их получаете и потом подставляете в расчёт?
for(int i=1; i<=period; i++)
{
H1_Close[i]=Close[k];
k--;
}
Я их беру кусок таймсессии равный периоду начиная с последнего закрытого бара и переворачиваю чтобы в массиве он лежал зеркально т.к. в тайсессии 1-это предпоследний бар, а как я понял расчет должен начинаться с i-го
т.е. моя функция должна возвращать значение SMMA последнего закрытого бара.
В нижеприведенном коде закодирована простая идея.
Если последний закрытый ордер СЕЛ
Если последний закрытый ордер закрылся по СЛ
Открыть ордер СЕЛ
if ( OrderType ()==OP_SELL)
X = OrderProfit( );
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))
if ( OrderType ()==OP_BUY)
if(X < 0)
OrderSend(Symbol(),OP_SELL,0.1,Bid ,3,Ask+400*Point,Ask-200*Point,"17-10",123 );
ВОПРОС
При помощи какой языковой конструкции можно добавить в этот код еще два новых условия (выделил красным)
Если последний закрытый ордер СЕЛ
Если ПРЕДпоследний ордер СЕЛ
Если последний закрытый ордер закрылся по СЛ
Если ПРЕДпоследний закрытый ордер закрылся по СЛ
Спасибо за помощь.
Буду очень признателен если напишете код, а не объясните на словах что нужно делать.
Здравствуйте. Я пишу скрипт для удаления всех отложенных ордеров. Однако он удаляет лишь один ордер. У меня всегда есть два отложенных ордера или один. В любом случае он удаляет один только Buy Stop. Для удаления Sell Stop нужно снова запустить скрипт, при условии, что нет других ордеров Buy Stop. Подскажите, где ошибка.
направление перебора измените for(i=total-1;i>=0;i--)
Спасибо, теперь работает. Правильно ли я понимаю, что при удалении ордера с индексом 0, ордеру с индексом 1 присваивается индекс 0, а при следующей итерации i == 1, а такого ордера получается нет. Скажите, так ли?
Есть функция настраиваемых фракталом, ну блин, какая-то ужасно тяжёлая. Рисование объектов оставил только для визуального отображения правильности формирования фракталов - его не будет.
Вопрос: как можно облегчить, а то тупит визуальное тестирование:
extern int FrRight=5; // Баров справа
//-----------------------------------------------------------------------------------------------
void OnTick()
{
int nFrUp= GetBarFractal(Symbol(),PERIOD_CURRENT,FrLeft,FrRight,0,MODE_UPPER); // Возвращает номер бара
int nFrDn= GetBarFractal(Symbol(),PERIOD_CURRENT,FrLeft,FrRight,0,MODE_LOWER); // Возвращает номер бара
double FrHigh = High[nFrUp]; // Цена верхнего фрактала
double FrLow = Low [nFrDn]; // Цена нижнего фрактала
SetArrow("FrUp"+"_"+(string)Time[nFrUp], Time[nFrUp], High[nFrUp], clrDeepSkyBlue, 217, 2, ANCHOR_BOTTOM);
SetArrow("FrDn"+"_"+(string)Time[nFrDn], Time[nFrDn], Low[nFrDn], clrDeepPink, 218, 2, ANCHOR_TOP);
// Comment("Price: ",FrHigh,", Num: ",nFrUp,"\nPrice: ",FrLow,", Num: ",nFrDn);
}
//----------------------------------------------------------------------------------------------+
//---------------------- Возвращает номер бара фрактала (настраиваемый) ------------------------+
//----------------------------------------------------------------------------------------------+
int GetBarFractal(string symb,ENUM_TIMEFRAMES tf=0,int nLeft=2,int nRight=2,int numFr=0,int mode=MODE_UPPER) {
int i=0,cn=0,pos=0,r=0,l=0,e=0,equals,bars;
double _high[], _low[];
nLeft=nLeft<=2?2:nLeft;
nRight=nRight<=2?2:nRight;
equals=nLeft+nRight;
bars=Bars(symb,tf)-equals;
ArraySetAsSeries(_high,true);
ArraySetAsSeries(_low,true);
for(pos=nRight+1; pos<bars; pos++) {
r=nRight;
if(mode==MODE_UPPER) {
CopyHigh(symb,tf,0,pos+equals+1,_high);
for(i=1; i<=r; i++) {
if(_high[pos]<=_high[pos-i]) break;
}}
if(mode==MODE_LOWER) {
CopyLow(symb,tf,0,pos+equals+1,_low);
for(i=1; i<=r; i++) {
if(_low[pos]>=_low[pos-i]) break;
}}
//--
if(i==r+1) {
l=nLeft;
e=equals;
for(int j=1; j<=l+equals; j++) {
if(mode==MODE_UPPER) {
if(_high[pos]<_high[pos+j]) break;
if(_high[pos]>_high[pos+j]) l--;
if(_high[pos]==_high[pos+j]) e--;
}
if(mode==MODE_LOWER) {
if(_low[pos]>_low[pos+j]) break;
if(_low[pos]<_low[pos+j]) l--;
if(_low[pos]==_low[pos+j]) e--;
}
if(l==0) {
cn++;
if(cn>numFr) return(pos);
}
//--
if(e<0) break;
}}
}
Print(__FUNCTION__": Фрактал не найден");
return(0);
}
//----------------------------------------------------------------------------------------------+
//------------------- Функция рисования значка на графике, объект OBJ_ARROW --------------------+
//----------------------------------------------------------------------------------------------+
void SetArrow(string nm="", datetime t1=0, double p1=0, color col=clrRed,
int code=252, int width=1, int anchor=0) {
if(ObjectFind(0,nm)==-1) {
ObjectCreate(0,nm,OBJ_ARROW,0,0,0);
ObjectSetInteger(0,nm,OBJPROP_COLOR,col);
ObjectSetInteger(0,nm,OBJPROP_ARROWCODE,code);
ObjectSetInteger(0,nm,OBJPROP_ANCHOR,anchor);
ObjectSetInteger(0,nm,OBJPROP_WIDTH,width);
ObjectSetInteger(0,nm,OBJPROP_SELECTED,false);
ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,true);
ObjectSetInteger(0,nm,OBJPROP_HIDDEN,false);
ObjectSetDouble(0,nm,OBJPROP_PRICE,p1);
ObjectSetInteger(0,nm,OBJPROP_TIME,t1);
}
}
Спасибо!
Есть функция настраиваемых фракталом, ну блин, какая-то ужасно тяжёлая. Рисование объектов оставил только для визуального отображения правильности формирования фракталов - его не будет.
Вопрос: как можно облегчить, а то тупит визуальное тестирование:
Спасибо!
Здравствуйте. Не подскажите новичку.
Вот пример:
if(Условие1)
if(Условие2)
{
}
else
{
}
По программе Else должно относиться к if(условие1) и выполнится при невыполнении Условия1
А по сути оно же выполнится при невыполнении Условия2.
Здравствуйте. Не подскажите новичку.
Вот пример:
if(Условие1)
if(Условие2)
{
}
else
{
}
По программе Else должно относиться к if(условие1) и выполнится при невыполнении Условия1
А по сути оно же выполнится при невыполнении Условия2.
Имейте привычку ставить фигурные скобки сразу с условием
if(Условие)
{
}
A по вашему вопросу так
{
if(Условие2)
{
}
}
else
{
}