Esto... python está muy bien y es la mejor forma de hacerte tus manipulaciones y experimentos... pero para el caso presente, teniendo en cuenta que no sé como inyectar desde python los archivos .hst(que están comprimidos; no son texto plano) no sabría hacerlo sin lo del FileOpenHistory.
Por tanto es cuestión de bajarse el csv del periodo determinado(puede hacerse manualmente desde la web y con el pseudo-api [
http://ichart.finance.yahoo.com/table.c ... .....sigue, buscar] . Vas a
http://finance.yahoo.com/q/hp?s=YHOO le das bajar a csv y esa url del csv ya te indica como obtener lo que quieras cambiando el periodo, etc.
Ya con el .csv segur oque encuentras algo para pasarlo a historial offline. Por seguir con lo que adjunté... y ol o que haría es algo como(viendo la página
http://forum.mql4.com/22834):
###########primero habro el csv y lo referencio(es algo raro esto de darle a un int, pero bueno)
ref = FileOpen("esecsvenelmismodirectorioqueelmql4.csv",FILE_CSV|FILE_READ,';');
#######leeremos cada linea del csv, que normalmente se separa por ese";".... normalmente...
##############abro ciclo que no parará mientras el puntero no esté en el final.
while(!FileIsEnding(ref))
################leemos una linea(el puntero pasará a la siguiente).
liniax = FileReadString(ref);
################como cada linia no tiene un ancho establecido hay que ir a por la posición de las comas..
pos1 = StringFind(",", liniax, 0);
################para averiguar la siguiente coma no puedo empezar otra vez por 0...
pos2 = StringFind(",", liniax, (pos1+1));
################vamos a extraer(obtener texto[string]) hasta la primera coma(ejemplo; hasta la posición 10[la excluye])
texto1 = StringSubstr(liniax, 0, pos1);
#################ahora de la primera coma a la segunda
texto2 = StringSubstr(liniax, (pos1+1), (pos2-pos1));
################### todo esto siguiendo los comandos en
http://docs.mql4.com
dentro de cada vuelta del ciclo debemos obtener cada valor(open,close,high...) leidos desde el csv... y entonces debemos insertarlo en el en historial .hst con FileWriteInteger o FileWriteDouble. copio del citado mql4...
//---- variables
int ExtHandle,XVersion,XPeriod,XDigits,XUnused[13],XTime,XOpen,XLow,XHigh,XClose,XVolume;
string XCopyright,XSymbol;
//---- header
XVersion=400;
XCopyright="cu6yu4";
XSymbol="MARKET";
XPeriod=1;
XDigits=1;
ExtHandle=FileOpenHistory("MARKET1.hst",FILE_BIN|FILE_WRITE);
FileWriteInteger(ExtHandle,XVersion,LONG_VALUE);
FileWriteString(ExtHandle, XCopyright,64);
FileWriteString(ExtHandle,XSymbol,12);
FileWriteInteger(ExtHandle,XPeriod,LONG_VALUE);
FileWriteInteger(ExtHandle,XDigits,LONG_VALUE);
FileWriteInteger(ExtHandle,0,LONG_VALUE);
FileWriteInteger(ExtHandle,0,LONG_VALUE);
FileWriteArray(ExtHandle,XUnused,0,13);
Esto solo se escribe 1 vez y por tanto irá antes del citado ciclo while. Pero aquí tenemos para 1MIN y yahoo da cada 1440 minutos... SUPONGO que habrá que poner XPeriod=1440; pero eso también cambiará el largo de la cabecera... ahora no sé...
En todo caso debemos repetir (osea, dentro el ciclo):
//---- data
XTime=StrToTime("2020.01.01 00:00");
XOpen=1;
XLow=1;
XHigh=1;
XClose=1;
XVolume=1;
FileWriteInteger(ExtHandle,XTime,LONG_VALUE);
FileWriteDouble(ExtHandle,XOpen,DOUBLE_VALUE);
FileWriteDouble(ExtHandle,XLow,DOUBLE_VALUE);
FileWriteDouble(ExtHandle,XHigh,DOUBLE_VALUE);
FileWriteDouble(ExtHandle,XClose,DOUBLE_VALUE);
FileWriteDouble(ExtHandle,XVolume,DOUBLE_VALUE);
###########entendiendo que XOpen, XLow... etc los conseguiriamos leyendo el csv. teniendo tambie´n en cuentas que antes tendremos que pasar del formato texto tipo "2012-03-08" a un integer(natural) que indica el tiempo... los segundos desde el 1 de enero del 1970(creo recordar). Esto se consigue con la función StrToTime (
http://docs.mql4.com/convert/StrToTime).
Vemos que
http://docs.mql4.com/convert/StrToTime demanda una entrada en el formato "yyyy.mm.dd" cuando lo nuestro sería seguramente "yyyy-mm-dd". Por suerte las posiciones(de 2-2) en yahoo(csv)no cambian con lo que...
###########repetimos... con cada tramo de la fecha...
year = StringSubstr(texto1, 0, 4);
############luego toca formar ya un texto con puntos...
date_string = StringConcatenate(year, ".", month, ".", day)
############Y con esto ya obtenemos la fecha en segundos
date_int = StrToTime("date_string")
############siempre que luego nos acepten meses y dias que empiezen por 0. si no antes...
if (StringSubstr(month, 0, 1) == 0) {month = StringSubstr(month, 1, 2)
.............
.................
Y si tod ova bien por ahí iría la cosa. Esta es la solución que ahora mismo se me ocurre, pero probablemente encuentres por ahí un producto ya hecho... de .csv a .hst