alexshell
Элитный участник
Да. Ты прав.
Смотрел на время с реала. На демо нету биткоинов.
Спасибо.
Попробуй использовать TimeLocal() . Правда там танцы с бубнами надо произвести, чтоб если время различается уровнять его как то.
Да. Ты прав.
Смотрел на время с реала. На демо нету биткоинов.
Спасибо.
Попробуй использовать TimeLocal() . Правда там танцы с бубнами надо произвести, чтоб если время различается уровнять его как то.
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;
}
Я еще году в 2013-м столкнулся с тем, что функция OnTimer() работает не по заданному циклу EventSetTimer или EventSetMillisecondTimer, а срабатывает только по приходу тиков, а в моем парном мультивалютнике на 5-ке при обработке 378 комбинаций пар пар, даже доли секунд были актуальны. С тех пор я так и забыл по эту функцию и вместо нее использую цикл типа while с регулируемой задержкой sleep внутри, и уже проверено не раз - это работает и проблем не возникает. Только выход из цикла нужно сделать, т.к., как я писал выше, функции проверки разрешения торгов могут не работать. А ведь там есть еще перенесенные с 5-го языка функции проверки того, какого уровня торговля разрешена на данной паре (может быть только открытие или закрытие открытых ордеров, или временная блокировка торгов по паре - все это уже работает на 4-ке).Попробуй использовать TimeLocal()
Включил только что(субота) советник на EURGBP а он долбит терминал, хочет открыть ордер.
TimeCurrent возвращает последнее известное время сервера.
У меня есть подозрение, что в то время торговля была разрешена.
Гыыыы...
Первый не прочитал следующие посты за проблемой, а второй перекинул проблему на первого.
Гыыыыы...
P.S. Слышал что бывает так что торговля(время терминала) кончается в суботу или начинается в воскресенье?
P.S. Слышал что бывает так что торговля(время терминала) кончается в суботу или начинается в воскресенье?
...
Но в любом случае ошибку то ты получаешь? Чё долбиться?
Слышал, что время сервера TimeCurrent может отличается от твоего времени TimeLocal, которые могут отличаться от торгового времени биржи? оО
...
У меня был случай несколько лет назад: мы со знакомой несколько месяцев оптимизировали моего сова (мартина) на Инсте и в итоге запустили на однотипных реальных счетах одновременно с одинаковыми настройками (я на одном со своего компа, она на 2-х на разных VPS-ах), и на одном ее счете сов сразу налепил кучу ордеров по всем правилам, но без всякого учета дистанции - счет втечение суток, естественно, был слит (около 1000 баксов). А на этой неделе друг запускал сова на Альпари на одинаковых ECN счетах параллельно и на одном счете сов отработал все ордера в плюс, на другом все в минус, и ордера открывались по-разному. После моей доработки сова и внесения трала, на графике в реале стала появляться ошибка 130 - неправильное выставление стоплосса, хотя этот трал проверен на многих других брокерах и прекрасно работает, а единственное, почему может возникать ошибка 130 - это выставление стоплосса в пределах стопуровня, который в самом трале всегда проверяется и вносятся корректировки. Короче, я перетащил в сова набор функций из моей последней разработки с автоматическим переходом в виртуальный режим и обратно, только проверить не успели - на следующей неделе будем гонять на реале. А если брокер так и не будет давать выставлять стопы, то только принудительный виртуальный режим. И вот фиг знает, что можно в этом плане брокерам предъявить...Но в любом случае ошибку то ты получаешь? Чё долбиться?
Я вас прошу. Не втыкайте. Прочитайте хоть пару прошлых постов. Ой гыгыгыыы...
Я вас прошу. Не втыкайте. Прочитайте хоть пару прошлых постов. Ой гыгыгыыы...
Смотрел на время с реала. На демо нету биткоинов.
как в случае целочисленного деления - сам себя перехитрил и нашел несуществующую ошибку? :facepalm:
//+------------------------------------------------------------------+ //| Возвращает номер бара последнего пересечения 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);}
Накидал советник быстро, буквально за 5 минут, смотрите. Если что надумаете как либо доводить до ума, пишите в скайп myforexea2017Уважаемые форумчане, помогите с кодом, если не сложно. Условие: если цена выше МА(например), то продажа, закрылся с минусом – сразу покупка и наоборот и т.д. Цикл продолжается до наступления положительного события. Заранее благодарен. С уважением.
Привет! Можно по такому алгоритму:Привет, коллеги!
Недавно начал изучать язык и столкнулся с одной задачей. Как прописать в коде повторный вход по осциллятору? То есть, должна получиться сетка с закрытием по обратному сигналу.
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;
}
}