Ваши вопросы по языку MQL4

alexshell

Элитный участник
Да. Ты прав.
Смотрел на время с реала. На демо нету биткоинов.
Спасибо.

Попробуй использовать TimeLocal() . Правда там танцы с бубнами надо произвести, чтоб если время различается уровнять его как то.
 

eevviill2

Местный знаток
Попробуй использовать TimeLocal() . Правда там танцы с бубнами надо произвести, чтоб если время различается уровнять его как то.
PHP:
bool first_tick_chaked=false;
int time_shift;
datetime TimeLoca;
////////////////////////////////////////////////////////////
 void OnTick()
 { 
 if(!first_tick_chaked)
 {
 first_tick_chaked=true;
EventSetTimer(1);
 time_shift=int(TimeLocal()-TimeCurrent());
 }
 }
 ////////////////////////////////////////////////////////////
 void OnTimer()
 {  
 All();
  }


///////////////////////MAIN////////////////////////
void All()
{
 //loca time
 TimeLoca=TimeLocal();

 //trading is not allowed
 if(!IsTradeAllowed() || !IsTradeAllowed(Symbol(),TimeLoca-time_shift)) return;
 }
 

vladradon

Программист
Попробуй использовать TimeLocal()
Я еще году в 2013-м столкнулся с тем, что функция OnTimer() работает не по заданному циклу EventSetTimer или EventSetMillisecondTimer, а срабатывает только по приходу тиков, а в моем парном мультивалютнике на 5-ке при обработке 378 комбинаций пар пар, даже доли секунд были актуальны. С тех пор я так и забыл по эту функцию и вместо нее использую цикл типа while с регулируемой задержкой sleep внутри, и уже проверено не раз - это работает и проблем не возникает. Только выход из цикла нужно сделать, т.к., как я писал выше, функции проверки разрешения торгов могут не работать. А ведь там есть еще перенесенные с 5-го языка функции проверки того, какого уровня торговля разрешена на данной паре (может быть только открытие или закрытие открытых ордеров, или временная блокировка торгов по паре - все это уже работает на 4-ке).
 

vlad_123

Местный знаток
Включил только что(субота) советник на EURGBP а он долбит терминал, хочет открыть ордер.

TimeCurrent возвращает последнее известное время сервера.
У меня есть подозрение, что в то время торговля была разрешена.
 

_SERG_

Активный участник
TimeCurrent возвращает последнее известное время сервера.
У меня есть подозрение, что в то время торговля была разрешена.

Так допиши проверку на день недели, или так и будешь насилием ДЦ по выходным заниматься? :D
 

eevviill2

Местный знаток
Гыыыы...
Первый не прочитал следующие посты за проблемой, а второй перекинул проблему на первого.
Гыыыыы...

P.S. Слышал что бывает так что торговля(время терминала) кончается в суботу или начинается в воскресенье?
 

_SERG_

Активный участник
Гыыыы...
Первый не прочитал следующие посты за проблемой, а второй перекинул проблему на первого.
Гыыыыы...

P.S. Слышал что бывает так что торговля(время терминала) кончается в суботу или начинается в воскресенье?

И тебе такой попался? :D Или ты его сам выбрал?(Для тренеровки.)
Даже на каком то таком тренеровался. А ещё на таком, где в понедельник все позы переоткрывались за вычетом свопа, и с новыми тикетами.
Но в любом случае ошибку то ты получаешь? Чё долбиться?
 

vlad_123

Местный знаток
P.S. Слышал что бывает так что торговля(время терминала) кончается в суботу или начинается в воскресенье?

Слышал, что время сервера TimeCurrent может отличается от твоего времени TimeLocal, которые могут отличаться от торгового времени биржи? оО
Или, как в случае целочисленного деления - сам себя перехитрил и нашел несуществующую ошибку? :facepalm:
 

eevviill2

Местный знаток
...
Но в любом случае ошибку то ты получаешь? Чё долбиться?
Слышал, что время сервера TimeCurrent может отличается от твоего времени TimeLocal, которые могут отличаться от торгового времени биржи? оО
...
:D:D:D
Я вас прошу. Не втыкайте. Прочитайте хоть пару прошлых постов. Ой гыгыгыыы...
 

vladradon

Программист
Но в любом случае ошибку то ты получаешь? Чё долбиться?
У меня был случай несколько лет назад: мы со знакомой несколько месяцев оптимизировали моего сова (мартина) на Инсте и в итоге запустили на однотипных реальных счетах одновременно с одинаковыми настройками (я на одном со своего компа, она на 2-х на разных VPS-ах), и на одном ее счете сов сразу налепил кучу ордеров по всем правилам, но без всякого учета дистанции - счет втечение суток, естественно, был слит (около 1000 баксов). А на этой неделе друг запускал сова на Альпари на одинаковых ECN счетах параллельно и на одном счете сов отработал все ордера в плюс, на другом все в минус, и ордера открывались по-разному. После моей доработки сова и внесения трала, на графике в реале стала появляться ошибка 130 - неправильное выставление стоплосса, хотя этот трал проверен на многих других брокерах и прекрасно работает, а единственное, почему может возникать ошибка 130 - это выставление стоплосса в пределах стопуровня, который в самом трале всегда проверяется и вносятся корректировки. Короче, я перетащил в сова набор функций из моей последней разработки с автоматическим переходом в виртуальный режим и обратно, только проверить не успели - на следующей неделе будем гонять на реале. А если брокер так и не будет давать выставлять стопы, то только принудительный виртуальный режим. И вот фиг знает, что можно в этом плане брокерам предъявить...
 
Последнее редактирование:

vlad_123

Местный знаток
:D:D:D
Я вас прошу. Не втыкайте. Прочитайте хоть пару прошлых постов. Ой гыгыгыыы...

Прочитал.
Ты сам подтвердил что
Смотрел на время с реала. На демо нету биткоинов.

Что в свою очередь не опровергает, что
как в случае целочисленного деления - сам себя перехитрил и нашел несуществующую ошибку? :facepalm:
 

max020780

Новичок форума
Помогите разобраться в чем ошибка почему возвращает неправильное значение или подскажите может можно как то проще написать нужно чтоб если между двумя пересечениями MA есть определенное количество баров mql5.com/ru/docs/series/bars и определенная высота в пунктах то возвращался номер бара самого последнего пересечения ma соответствующего заданным критериям
PHP:
 //+------------------------------------------------------------------+ //|       Возвращает номер бара последнего пересечения MA            |//+--------------------------------------------------------------------+//+----------------------------------------------------------------------------+//|  Параметры:                                                                //|   sy - наименование инструмента   (""   - любой символ, //|   countperes - общее количество пересечений для поиска             //|   signal - сигнал который ищем значение может быть Buy или Sell//+----------------------------------------------------------------------------+int FirstBar(string sy="",int countperes=0, string signal=""){int bar ;   if (sy=="0") sy=Symbol();   if (_Symbol==sy || sy=="")   {    if( signal=="Buy")    {      // Проверяем если есть сегодня пересечение      if(BarMa(FMa,SMa,1,NumberBar)>0 ) // возвращает бар последнего пересечения      {         for ( int i=1; i<countperes ; i++)         {                                  //если есть пересечение Ma сегодня и Если расстояние между последними пересечениями больше CountBar и высота больше или равна MinTHP и меньше или равно MaxTHP         if (BarMa(FMa,SMa,countperes,NumberBar)>0 && (BarMa(FMa,SMa,i+1,NumberBar+1000)-BarMa(FMa,SMa,i,NumberBar))>CountBar)         {                       mas=iMA(NULL,0,SMa,0,MODE_SMA,PRICE_CLOSE,BarMa(FMa,SMa,i,NumberBar));    // Slow MA shifted on 1 Period            maf=iMA(NULL,0,FMa,0,MODE_SMA,PRICE_CLOSE,BarMa(FMa,SMa,i,NumberBar));    // Fast MA shifted on 1 Period            mas_p=iMA(NULL,0,SMa,0,MODE_SMA,PRICE_CLOSE,BarMa(FMa,SMa,i,NumberBar)+1);  // Slow MA shifted on 2 Period            maf_p=iMA(NULL,0,FMa,0,MODE_SMA,PRICE_CLOSE,BarMa(FMa,SMa,i,NumberBar)+1);  // Fast MA shifted on 2 Period            if((maf>=mas && maf_p<=mas_p)) {          // Найдем Минимум среди баров пересечения двух точек            MinLowBar= iLowest(Symbol(),TF,MODE_LOW, BarMa(FMa,SMa,i+1,NumberBar+1000),BarMa(FMa,SMa,i,NumberBar)); // номер бара с минимальным значением между пересечениями двух МА            MinLow=NormalizeDouble(iLow(Symbol(),TF,MinLowBar),5);// цена бара с минимальным значением между пересечениями двух МА            PriceBuy=NormalizeDouble(mas,5); // цена пересечения МА для сигнала на Buy           if((PriceBuy-MinLow)/Point>= MinTHP && (PriceBuy-MinLow)/Point<=MaxTHP)           {         bar=BarMa(FMa,SMa,i,NumberBar);                //  break;         }                 }         }         }         }         }                   if( signal=="Sell")    {      // Проверяем если есть сегодня пересечение      if(BarMa(FMa,SMa,1,NumberBar)>0 ) // возвращает бар последнего пересечения      {         for ( int i=1; i<countperes ; i++)         {                                  //если есть пересечение Ma сегодня и Если расстояние между последними пересечениями больше CountBar и высота больше или равна MinTHP и меньше или равно MaxTHP         if (BarMa(FMa,SMa,countperes,NumberBar)>0 && (BarMa(FMa,SMa,i+1,NumberBar+1000)-BarMa(FMa,SMa,i,NumberBar))>CountBar)         {            mas=iMA(NULL,0,SMa,0,MODE_SMA,PRICE_CLOSE,BarMa(FMa,SMa,i,NumberBar));    // Slow MA shifted on 1 Period            maf=iMA(NULL,0,FMa,0,MODE_SMA,PRICE_CLOSE,BarMa(FMa,SMa,i,NumberBar));    // Fast MA shifted on 1 Period            mas_p=iMA(NULL,0,SMa,0,MODE_SMA,PRICE_CLOSE,BarMa(FMa,SMa,i,NumberBar)+1);  // Slow MA shifted on 2 Period            maf_p=iMA(NULL,0,FMa,0,MODE_SMA,PRICE_CLOSE,BarMa(FMa,SMa,i,NumberBar)+1);  // Fast MA shifted on 2 Period              if((maf<=mas && maf_p>=mas_p)){         // Найдем Максимум  среди баров пересечения двух точек            MaxHighBar= iHighest(Symbol(),TF,MODE_HIGH, BarMa(FMa,SMa,i+1,NumberBar+1000),BarMa(FMa,SMa,i,NumberBar)); // номер бара с максимальным значением между пересечениями двух МА            MaxHigh= NormalizeDouble(iHigh(Symbol(),TF,MaxHighBar),5); // цена бара с максимальным значением между пересечениями двух МА            PriceSell=NormalizeDouble(mas_p,5); // цена пересечения МА для сигнала на Sell           if((MaxHigh-PriceSell)/Point>=MinTHP && (MaxHigh-PriceSell)/Point<= MaxTHP)           {                    bar=BarMa(FMa,SMa,i,NumberBar);          //break;         }                 }         }         }         }         }         }         if (BarMa(FMa,SMa,1,NumberBar)<0) bar = -1;return(bar);}
 
Последнее редактирование модератором:

jelolo

Активный участник
Уважаемые форумчане, помогите с кодом, если не сложно. Условие: если цена выше МА(например), то продажа, закрылся с минусом – сразу покупка и наоборот и т.д. Цикл продолжается до наступления положительного события. Заранее благодарен. С уважением.
 

iBoss

Заблокирован
Уважаемые форумчане, помогите с кодом, если не сложно. Условие: если цена выше МА(например), то продажа, закрылся с минусом – сразу покупка и наоборот и т.д. Цикл продолжается до наступления положительного события. Заранее благодарен. С уважением.
Накидал советник быстро, буквально за 5 минут, смотрите. Если что надумаете как либо доводить до ума, пишите в скайп myforexea2017
 

Вложения

  • MaRevers.mq4
    3,3 КБ · Просмотры: 36

well72

Активный участник
Привет, коллеги!
Недавно начал изучать язык и столкнулся с одной задачей. Как прописать в коде повторный вход по осциллятору? То есть, должна получиться сетка с закрытием по обратному сигналу.
OeBcTSvjRpWjNt4RRBPBXw.png
 
Последнее редактирование модератором:

vladradon

Программист
Привет, коллеги!
Недавно начал изучать язык и столкнулся с одной задачей. Как прописать в коде повторный вход по осциллятору? То есть, должна получиться сетка с закрытием по обратному сигналу.
Привет! Можно по такому алгоритму:
PHP:
bool SigBuy=false, SigSell=false; 
double LevelUp=значение верхнего уровня осциллятора;
double LevelDown=значение нижнего уровня осциллятора;
double x=Значение отсечки "дребезга" колебаний возле уровней;

void OnTick(){

double Sig=Считываем данные осциллятора;
if(Sig>LevelUp+x && !SigSell) SigSell=true;
if(Sig<LevelDown-x && !SigBuy) SigBuy=true;
if(SigBuy && Sig>LevelDown+x)
 {
  Команды закрытия ордеров селл;
  Команда открытия ордера бай;
  SigBuy=false;
 } 
if(SigSell && Sig<LevelUp-x)
 {
  Команды закрытия ордеров бай;
  Команда открытия ордера селл;
  SigSell=false;
 }
}
Всех данных не знаю, поэтому только общий текст кода и неизвестные элементы сам подставь. Команды закрытия ордеров можно перенести в строки проверки пересечения сигнала осциллятора с уровнями на пробой - это уже как по стратегии правильнее, так и прописывай.
 
Последнее редактирование:
Верх