Оптимизация советников МТ4 в Кластере

 
Добрый день, подскажите может ли ваша программа работать в кластере (группа компьютеров) во время оптимизации советников, задействует ли она доступные ресурсы процессоров кластера, или будет работать только с локальным процессором?
 
От кластера будет толк в случае оптимизации тяжелых советников + одновременной оптимизации в разных терминалах.
 
Нет, терминал не работает в кластере.
 
Претендую на то, что распараллелить оптимизацию в ТМ можно как нефиг геделать. Достаточно всего лишь форкнуться (не многопоточиться) и сделать некий процесс, который бы контроллировал все подпроцессы, раздавал им задания и собирал воедино результаты. С таким подходом можно любую хрень в коде распараллелить, как бы криво код написан небыл (вы когда-то говорили что у вас код не предназначен для распараллеливания).

Вообще у меня есть советники с тяжёлой логикой, которые оптимизируются по 2-3 дня. При чём для одного параметра!!! Около 200 шагов. Просто там много всего, и АМА, и зиг-заги и иные адаптивные индюки. Я бы поставил серверок с 10 процами, оно бы летало :-)
 
Вообще у меня есть советники с тяжёлой логикой, которые оптимизируются по 2-3 дня. При чём для одного параметра!!! Около 200 шагов. Просто там много всего, и АМА, и зиг-заги и иные адаптивные индюки. Я бы поставил серверок с 10 процами, оно бы летало :-)

Уверен, что с алгоритмической оптимизацией Вы получите скорость в 10-100 раз больше текущей. Уберите лишние вызовы, явным образом подумайте - какие условия при работе в тестере, нужно ли делать все сложно, когда в тестере Вы одни и тд.

Даже банальное добавление нескольких упрощенных функций, которые замещают тяжелые рабочие функции при работе в тестере дает многократный прирост.

Выложите полный код своего эксперта прямо тут и мы устроим публичное соревнование по оптимизации Вашего кода. А затем опубликуем все этапы и результаты от разных программистов. Будет очень полезное зрелище.

Я сам с удовольствием приму участие.
 
Неа!

Алгоритмическая оптимизация имеет свой предел сложности.
Если эксперт просто написан с множеством вложенных циклов и неэффективной работе с памятью то это может привести. У меня же идея сама по себе основана на автоматическом бек-тестировании советника. Вообще до доработки ещё долго, пока сырой.

А вообще, тестер нехило начинает тормозить уже при использовании 2-3 сложных индикаторов. Замените стохастик на адаптивный стохастик, МА на АМА, добавьте зигзаг и производительность сдохнет нафиг. А адаптивные индюки гораздо эффективнее обычных. Я же иногда разрабатываю паттерновы индюки, которые отыскивают паттерны за последние 2-5 дней на часах и в зависимоти от них устанавливают какой-либо уровень. Вот тут уже тормоза совсем серьёзные. Конечно система на стохастике будет жить весело и быстро.
 
Вот именно поэтому я и говорю - не нужно слов, просто опубликуйте полный код, а мы проведем публичное соревнование на максимальное ускорение путем алгоритмической оптимизации.

Я против теоретических рассуждений - только фактический материал, доступный для массового восприятия может служить доказательством.
 
Вот именно поэтому я и говорю - не нужно слов, просто опубликуйте полный код, а мы проведем публичное соревнование на максимальное ускорение путем алгоритмической оптимизации.

Я против теоретических рассуждений - только фактический материал, доступный для массового восприятия может служить доказательством.

Вот пример тормознутого советника.

//+------------------------------------------------------------------+
//| Copyright 2005, Gordago Software Corp. |
//| http://www.gordago.com/ |
//| version 2.0 |
//+------------------------------------------------------------------+

#property copyright "Copyright 2005, Gordago Software Corp."
#property link "http://www.gordago.com"

#define MIN_STOPLOSS_POINT 10
#define MIN_TAKEPROFIT_POINT 10
#define MAGIC 180865

extern string sNameExpert = "Generate from Gordago";
extern int nAccount =0;
extern double dBuyStopLossPoint = 20;
extern double dSellStopLossPoint = 20;
extern double dBuyTakeProfitPoint = 50;
extern double dSellTakeProfitPoint = 50;
extern double dBuyTrailingStopPoint = 15;
extern double dSellTrailingStopPoint = 15;
extern double dLots = 0.5;
extern int nSlippage = 4;
extern bool lFlagUseHourTrade = False;
extern int nFromHourTrade = 0;
extern int nToHourTrade = 23;
extern bool lFlagUseSound = True;
extern string sSoundFileName = "alert.wav";
extern color colorOpenBuy = Blue;
extern color colorCloseBuy = Aqua;
extern color colorOpenSell = Red;
extern color colorCloseSell = Aqua;


void deinit() {
Comment("");
}

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start(){
if (lFlagUseHourTrade){
if (!(Hour()>=nFromHourTrade && Hour()<=nToHourTrade)) {
Comment("Time for trade has not come else!");
return(0);
}
}

if(Bars < 100){
Print("bars less than 100");
return(0);
}

if (nAccount > 0 && nAccount != AccountNumber()){
Comment("Trade on account :"+AccountNumber()+" FORBIDDEN!");
return(0);
}

if((dBuyStopLossPoint > 0 && dBuyStopLossPoint < MIN_STOPLOSS_POINT) ||
(dSellStopLossPoint > 0 && dSellStopLossPoint < MIN_STOPLOSS_POINT)){
Print("StopLoss less than " + MIN_STOPLOSS_POINT);
return(0);
}
if((dBuyTakeProfitPoint > 0 && dBuyTakeProfitPoint < MIN_TAKEPROFIT_POINT) ||
(dSellTakeProfitPoint > 0 && dSellTakeProfitPoint < MIN_TAKEPROFIT_POINT)){
Print("TakeProfit less than " + MIN_TAKEPROFIT_POINT);
return(0);
}

double diMA0=iMA(NULL,1,6,0,MODE_EMA,PRICE_CLOSE,0);
double diClose1=iClose(NULL,1,0);
double diMA2=iMA(NULL,5,13,0,MODE_EMA,PRICE_CLOSE,0);
double diClose3=iClose(NULL,5,0);
double diMA4=iMA(NULL,15,21,0,MODE_EMA,PRICE_CLOSE,0);
double diClose5=iClose(NULL,15,0);
double diMA6=iMA(NULL,30,32,0,MODE_EMA,PRICE_CLOSE,0);
double diClose7=iClose(NULL,30,0);
double diMA8=iMA(NULL,1,6,0,MODE_EMA,PRICE_CLOSE,0);
double diClose9=iClose(NULL,1,0);
double diMA10=iMA(NULL,5,13,0,MODE_EMA,PRICE_CLOSE,0);
double diClose11=iClose(NULL,5,0);
double diMA12=iMA(NULL,15,21,0,MODE_EMA,PRICE_CLOSE,0);
double diClose13=iClose(NULL,15,0);
double diMA14=iMA(NULL,30,32,0,MODE_EMA,PRICE_CLOSE,0);
double diClose15=iClose(NULL,30,0);


if(AccountFreeMargin() < (1000*dLots)){
Print("We have no money. Free Margin = " + AccountFreeMargin());
return(0);
}

bool lFlagBuyOpen = false, lFlagSellOpen = false, lFlagBuyClose = false, lFlagSellClose = false;

lFlagBuyOpen = (diMA0<diClose1 && diMA2<diClose3 && diMA4<diClose5 && diMA6<diClose7);
lFlagSellOpen = (diMA8>diClose9 && diMA10>diClose11 && diMA12>diClose13 && diMA14>diClose15);
lFlagBuyClose = False;
lFlagSellClose = False;

if (!ExistPositions()){

if (lFlagBuyOpen){
OpenBuy();
return(0);
}

if (lFlagSellOpen){
OpenSell();
return(0);
}
}
if (ExistPositions()){
if(OrderType()==OP_BUY){
if (lFlagBuyClose){
bool flagCloseBuy = OrderClose(OrderTicket(), OrderLots(), Bid, nSlippage, colorCloseBuy);
if (flagCloseBuy && lFlagUseSound)
PlaySound(sSoundFileName);
return(0);
}
}
if(OrderType()==OP_SELL){
if (lFlagSellClose){
bool flagCloseSell = OrderClose(OrderTicket(), OrderLots(), Ask, nSlippage, colorCloseSell);
if (flagCloseSell && lFlagUseSound)
PlaySound(sSoundFileName);
return(0);
}
}
}

if (dBuyTrailingStopPoint > 0 || dSellTrailingStopPoint > 0){

for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
bool lMagic = true;
if (MAGIC > 0 && OrderMagicNumber() != MAGIC)
lMagic = false;

if (OrderSymbol()==Symbol() && lMagic) {
if (OrderType()==OP_BUY && dBuyTrailingStopPoint > 0) {
if (Bid-OrderOpenPrice() > dBuyTrailingStopPoint*Point) {
if (OrderStopLoss()<Bid-dBuyTrailingStopPoint*Point)
ModifyStopLoss(Bid-dBuyTrailingStopPoint*Point);
}
}
if (OrderType()==OP_SELL) {
if (OrderOpenPrice()-Ask>dSellTrailingStopPoint*Point) {
if (OrderStopLoss()>Ask+dSellTrailingStopPoint*Point || OrderStopLoss()==0)
ModifyStopLoss(Ask+dSellTrailingStopPoint*Point);
}
}
}
}
}
}
return (0);
}

bool ExistPositions() {
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
bool lMagic = true;

if (MAGIC > 0 && OrderMagicNumber() != MAGIC)
lMagic = false;

if (OrderSymbol()==Symbol() && lMagic) {
return(True);
}
}
}
return(false);
}

void ModifyStopLoss(double ldStopLoss) {
bool lFlagModify = OrderModify(OrderTicket(), OrderOpenPrice(), ldStopLoss, OrderTakeProfit(), 0, CLR_NONE);
if (lFlagModify && lFlagUseSound)
PlaySound(sSoundFileName);
}

void OpenBuy() {
double dStopLoss = 0, dTakeProfit = 0;

if (dBuyStopLossPoint > 0)
dStopLoss = Bid-dBuyStopLossPoint*Point;

if (dBuyTakeProfitPoint > 0)
dTakeProfit = Ask + dBuyTakeProfitPoint * Point;


int numorder = OrderSend(Symbol(), OP_BUY, dLots, Ask, nSlippage, dStopLoss, dTakeProfit, sNameExpert, MAGIC, 0, colorOpenBuy);

if (numorder > -1 && lFlagUseSound)
PlaySound(sSoundFileName);
}

void OpenSell() {
double dStopLoss = 0, dTakeProfit = 0;

if (dSellStopLossPoint > 0)
dStopLoss = Ask+dSellStopLossPoint*Point;

if (dSellTakeProfitPoint > 0)
dTakeProfit = Bid-dSellTakeProfitPoint*Point;

int numorder = OrderSend(Symbol(),OP_SELL, dLots, Bid, nSlippage, dStopLoss, dTakeProfit, sNameExpert, MAGIC, 0, colorOpenSell);

if (numorder > -1 && lFlagUseSound)
PlaySound(sSoundFileName);
}
 
Нет, терминал не работает в кластере.

А будет работать когда нибудь?
 
Нет, терминал не работает в кластере.

А будет работать когда нибудь?

Нет, не будет.
 
Вот именно поэтому я и говорю - не нужно слов, просто опубликуйте полный код, а мы проведем публичное соревнование на максимальное ускорение путем алгоритмической оптимизации.

Я против теоретических рассуждений - только фактический материал, доступный для массового восприятия может служить доказательством.

Вот пример тормознутого советника.

Вот самый яркий пример, до чего доводит нежелание думать и использование волшебных "кнопок" типа Gordago. Конечно же, после таких "генераторов" получается абсолютно неоптимизированный и глубоко ошибочный код, который занимается исключительно потреблением ресурсов.

Я за час привел в чувство этого эксперта и ускорил его в 12 (Двенадцать) раз. Детали в форуме MQL4, так как тут не очень удобно выкладывать код и файлы:
"MQL4: Ускорить эксперта в 12 раз? Легко!"
Причина обращения: