Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вы уже показали свой уровень знания МетаТрейдера. Больше не утруждайтесь, пожалуйста.
Ренат, Большое Вам Спасибо за столь замечательную программу, как МетаТрейдер! Честное слово!
Простите, если надоедал комментариями. Мне хотелось сделать только лучше.
Вполне возможно, я отстаю от жизни.
Вместе с тем, по моим представлениям сделать это возможно только в простых случаях, например, если каждой открывающей должна соответствовать закрывающая, прежде, чем появится следующая открывыющая (или в аналогичных случаях).
Если же речь идёт о более сложных вложенных структурах, то у компилятора нет критериев, по кот. он может определить какой именно из 10 открывающих не хватает закрывающей.
Да вот хотя бы простой пример:
for (i..) { a++; for (j..) { b++; for (k..) { c++; } d++; } e++;"Где"? должна стоять недостающая закрывающая? Или "где" та открывающая, в соответствие которой не поставлена закрывающая?
Вот как раз в этом случае поможет мое предложение - программа отразит циклы, как она понимает, начиная с вложенных, и программист сразу визуально определит, где не хватает фигурной скобки.
//+------------------------------------------------------------------+ //| MACD_signal.mq4 | //| tom112 | //| tom112@mail.wplus.net | //+------------------------------------------------------------------+ #property copyright "tom112" #property link "tom112@mail.wplus.net" //---- input parameters extern double TakeProfit = 0; extern double Lots = 0.1; extern double TrailingStop = 0; extern int Pfast=7; extern int Pslow=36; extern int Psignal=7; extern double LEVEL=0.001; double Points; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { Points = MarketInfo (Symbol(), MODE_POINT); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { double MacdCurrent=0, MacdPrevious=0, SignalCurrent=0; double SignalPrevious=0, MaCurrent=0, MaPrevious=0; int cnt=0, total; int i1, pp, shift; double Tv[2][500] ; double Range, rr, Delta, Delta1, val3; // первичные проверки данных // важно удостовериться что эксперт работает на нормальном графике и // пользователь правильно выставил внешние переменные (Lots, StopLoss, // TakeProfit, TrailingStop) // в нашем случае проверяем только TakeProfit if(Bars<100) { Print("bars less than 100"); return(0); // на графике менее 100 баров } if(TakeProfit<10) { Print("TakeProfit less than 10"); return(0); // проверяем TakeProfit } Range = iATR(NULL,0,200,1); rr = Range*LEVEL; Delta=iMACD(NULL,0,Pfast,Pslow,Psignal,PRICE_CLOSE,MODE_MAIN,0)- iMACD(NULL, 0 ,Pfast,Pslow,Psignal,PRICE_CLOSE,MODE_SIGNAL,0); Delta1=iMACD(NULL,0,Pfast,Pslow,Psignal,PRICE_CLOSE,MODE_MAIN,1)- iMACD(NULL, 0 ,Pfast,Pslow,Psignal,PRICE_CLOSE,MODE_SIGNAL,1); // теперь надо определиться - в каком состоянии торговый терминал? // проверим, есть ли ранее открытые позиции или ордеры? if(OrdersTotal()<1) { // нет ни одного открытого ордера // на всякий случай проверим, если у нас свободные деньги на счету? // значение 1000 взято для примера, обычно можно открыть 1 лот if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money"); return(0); // денег нет - выходим } // проверим, не слишком ли часто пытаемся открыться? // если последний раз торговали менее чем 5 минут(5*60=300 сек) // назад, то выходим // If((CurTime-LastTradeTime)<300) return(0); // проверяем на возможность встать в длинную позицию (BUY) if( Delta>rr && Delta1<rr ) { OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Points,"macd signal",16384,0,Red); // исполняем if(GetLastError()==0)Print("Order opened : ",OrderOpenPrice()); return(0); // выходим, так как все равно после совершения торговой операции // наступил 10-ти секундный таймаут на совершение торговых операций } // проверяем на возможность встать в короткую позицию (SELL) if( Delta < -rr && Delta1 > -rr ) { OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Points,"macd sample",16384,0,Red); // исполняем if(GetLastError()==0)Print("Order opened : ",OrderOpenPrice()); return(0); // выходим }; // здесь мы завершили проверку на возможность открытия новых позиций. // новые позиции открыты не были и просто выходим по Exit, так как // все равно анализировать нечего return(0); }; // переходим к важной части эксперта - контролю открытых позиций // 'важно правильно войти в рынок, но выйти - еще важнее...' total=OrdersTotal(); for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && // это открытая позиция? OP_BUY или OP_SELL OrderSymbol()==Symbol()) // инструмент совпадает? { if(OrderType()==OP_BUY) // открыта длинная позиция { // проверим, может уже пора закрываться? if(Delta<0) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию return(0); // выходим }; // проверим - может можно/нужно уже трейлинг стоп ставить? if(TrailingStop>0) // пользователь выставил в настройках трейлингстоп { // значит мы идем его проверять if(Bid-OrderOpenPrice()>Points*TrailingStop) { if(OrderStopLoss()<Bid-Points*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Points*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } } else // иначе это короткая позиция { // проверим, может уже пора закрываться? if(Delta > 0) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // закрываем позицию return(0); // выходим } // проверим - может можно/нужно уже трейлинг стоп ставить? if(TrailingStop>0) // пользователь выставил в настройках трейлингстоп { // значит мы идем его проверять if((OrderOpenPrice()-Ask)>(Points*TrailingStop)) { if(OrderStopLoss()==0.0 || OrderStopLoss()>(Ask+Points*TrailingStop)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Points*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } } } } return(0); } // the end. //+------------------------------------------------------------------+Впрочем, мое дело сказать. Я уже сказал ;-))
Вот как раз в этом случае поможет мое предложение - программа отразит циклы, как она понимает, начиная с вложенных, и программист сразу визуально определит, где не хватает фигурной скобки.
Исходя из представленного примера, нельзя сделать никакого предположения о вложенности циклов. И "подсвечивая циклы" программа может просто ввести в заблуждение. Следующее предложение должно бы прозвучать так: "а давайте сделаем возможность подсветки скобок отключаемой!".
Проблем не возникнет изначально, если вложенные конструкции сразу писать с отступом - для этого есть клавиша "tab". Сначала года это второй мой совет начинающим программистам.
А вот Рош говорит, что он такие примеры даже не рассматривает. Классическая иллюстрация - "мне было трудно писать, пусть вам будет трудно читать"
Вот именно. "как она понимает"
Вот вопрос. На что должен ориентирваться человек, составляющий такую программу? Я бы и не брался, потому, что я не представляю на что.
А кроме того, при первом же касании вопроса любой незадачливый юзер сразу завопит, что "компилятор ничего не понимает!". И в принципе будет абсолютно прав, потому, что он думает об одном, а компилятор о чём-то своём.
Ну, сделали бы такой компилятор и что толку?
Сегодняшнее положение дел юзера не устраивает, потому что показывает всего лишь, что скобки нет.
А компилятор, сделанный по принципам, кот. заложит в него программист Иван Петрович, покажет, кроме того, что скобки нет, ещё и вариант (один из множества возможных), кот. заложит Иван Петрович, где бы эта скобка в принципе могла быть.
Разумеется, что предполагаемое место недостающей скобки , найденное по алгоритму Ивана Петровича, в ряде случаев не будет совпадать с местом, определённым в соответствии с гениальными мыслями юзера, не умеющего самостоятельно расставить скобки.
И кому это нужно? Юзер только ещё больше запутается. Особенно начинающий. А как же? Он ведь будет всецело и безоговорочно доверять компилятору..
p.s. лично я "правильным" считаю стль предложенный Ален И. Голуб в "Правила программирования на Си и Си++"
"ВЕРЕВКА ДОСТАТОЧНОЙ ДЛИНЫ,
ЧТОБЫ… ВЫСТРЕЛИТЬ СЕБЕ В НОГУ
Правила программирования на Си и Си++"
Ален И. Голуб
:-))