//--------------------------------------------------------------------------- void __fastcall TGUIConfiguration::LoadData(THierarchicalStorage * Storage) { TConfiguration::LoadData(Storage); // duplicated from core\configuration.cpp #define KEYEX(TYPE, VAR, NAME) VAR = Storage->Read ## TYPE(NAME, VAR) #pragma warn -eas REGCONFIG(false); #pragma warn +eas #undef KEYEX if (Storage->OpenSubKey(L"Interface\\CopyParam", false, true)) try { // must be loaded before eventual setting defaults for CopyParamList FDefaultCopyParam.Load(Storage); int CopyParamListCount = Storage->ReadInteger(L"CopyParamList", -1); FCopyParamListDefaults = (CopyParamListCount < 0); if (!FCopyParamListDefaults) { FCopyParamList->Clear(); FCopyParamList->Load(Storage, CopyParamListCount); } else if (FCopyParamList->Modified) { FCopyParamList->Clear(); FCopyParamListDefaults = false; } FCopyParamList->Reset(); } __finally { Storage->CloseSubKey(); } // Make it compatible with versions prior to 3.7.1 that have not saved PuttyPath // with quotes. First check for absence of quotes. // Add quotes either if the path is set to default putty path (even if it does // not exists) or when the path points to existing file (so there are no parameters // yet in the string). Note that FileExists may display error dialog, but as // it should be called only for custom users path, let's expect that the user // can take care of it. if ((FPuttyPath.SubString(1, 1) != L"\"") && (CompareFileName(ExpandEnvironmentVariables(FPuttyPath), FDefaultPuttyPathOnly) || FileExists(ExpandEnvironmentVariables(FPuttyPath)))) { FPuttyPath = FormatCommand(FPuttyPath, L""); } if (Storage->OpenSubKey(L"Interface\\NewDirectory2", false, true)) try { FNewDirectoryProperties.Load(Storage); } __finally { Storage->CloseSubKey(); } }
void TFarConfiguration::Default() { TGUIConfiguration::Default(); FForceInheritance = false; FConfirmOverwritingOverride = false; FConfirmSynchronizedBrowsing = true; SetDisksMenu(true); SetDisksMenuHotKey(0); SetPluginsMenu(true); SetPluginsMenuCommands(true); SetCommandPrefixes("netbox,ftp,scp,sftp,ftps,http,https,webdav"); SetHostNameInTitle(true); SetEditorDownloadDefaultMode(true); SetEditorUploadSameOptions(true); FEditorUploadOnSave = true; FEditorMultiple = false; FQueueBeep = true; SetCustomPanelModeDetailed(true); SetFullScreenDetailed(true); SetColumnTypesDetailed("N,S,DM,O,G,R"); SetColumnWidthsDetailed("0,8,14,0,0,9"); SetStatusColumnTypesDetailed("NR"); SetStatusColumnWidthsDetailed("0"); SetApplyCommandCommand(L""); SetApplyCommandParams(0); SetPuttygenPath(FormatCommand(::ExtractFilePath(ModuleFileName()) + "putty\\puttygen.exe", L"")); SetPageantPath(FormatCommand(::ExtractFilePath(ModuleFileName()) + "putty\\pageant.exe", L"")); FBookmarks->Clear(); }
//--------------------------------------------------------------------------- void __fastcall TCustomWinConfiguration::DefaultHistory() { ClearHistory(); std::unique_ptr<THistoryStrings> Strings; // Defaults for speed limits. Strings.reset(new THistoryStrings()); // This is language-specifics, what has to be dealt with when changing language. // There's ad-hoc workaround in CopySpeedLimits. // If we need to solve this for another history, we should introduce // a generic solution, like language-specific history ("SpeedLimitEN") Strings->Add(LoadStr(SPEED_UNLIMITED)); unsigned long Speed = 8192; while (Speed >= 8) { Strings->Add(IntToStr(int(Speed))); Speed = Speed / 2; } FHistory->AddObject(L"SpeedLimit", Strings.release()); Strings.reset(new THistoryStrings()); Strings->Add(FormatCommand(DefaultPuttyPath, L"")); Strings->Add(FormatCommand(DefaultPuttyPath, L"-t -m \"%TEMP%\\putty.txt\" !`cmd.exe /c echo cd '!/' ; /bin/bash -login > \"%TEMP%\\putty.txt\"`")); Strings->Add(KittyExecutable); Strings->Add(FORMAT(L"%s -cmd \"cd '!/'\" !U@!@ -P !# -title \"!N\"", (KittyExecutable))); FHistory->AddObject(L"PuttyPath", Strings.release()); }
void __fastcall BrowseForExecutableT(T * Control, UnicodeString Title, UnicodeString Filter, bool FileNameCommand, bool Escape) { UnicodeString Executable, Program, Params, Dir; Executable = Control->Text; if (FileNameCommand) { ReformatFileNameCommand(Executable); } SplitCommand(Executable, Program, Params, Dir); TOpenDialog * FileDialog = new TOpenDialog(Application); try { if (Escape) { Program = ReplaceStr(Program, L"\\\\", L"\\"); } UnicodeString ExpandedProgram = ExpandEnvironmentVariables(Program); FileDialog->FileName = ExpandedProgram; UnicodeString InitialDir = ExtractFilePath(ExpandedProgram); if (!InitialDir.IsEmpty()) { FileDialog->InitialDir = InitialDir; } FileDialog->Filter = Filter; FileDialog->Title = Title; if (FileDialog->Execute()) { TNotifyEvent PrevOnChange = Control->OnChange; Control->OnChange = NULL; try { // preserve unexpanded file, if the destination has not changed actually if (!CompareFileName(ExpandedProgram, FileDialog->FileName)) { Program = FileDialog->FileName; if (Escape) { Program = ReplaceStr(Program, L"\\", L"\\\\"); } } Control->Text = FormatCommand(Program, Params); } __finally { Control->OnChange = PrevOnChange; } if (Control->OnExit != NULL) { Control->OnExit(Control); } } }
//--------------------------------------------------------------------------- void __fastcall TGUIConfiguration::Default() { TConfiguration::Default(); // reset before call to DefaultLocalized() FDefaultCopyParam.Default(); FCopyParamListDefaults = true; DefaultLocalized(); FIgnoreCancelBeforeFinish = TDateTime(0, 0, 3, 0); FContinueOnError = false; FConfirmCommandSession = true; FSynchronizeParams = TTerminal::spNoConfirmation | TTerminal::spPreviewChanges; FSynchronizeModeAuto = -1; FSynchronizeMode = TTerminal::smRemote; FMaxWatchDirectories = 500; FSynchronizeOptions = soRecurse | soSynchronizeAsk; FQueueTransfersLimit = 2; FQueueKeepDoneItems = true; FQueueKeepDoneItemsFor = 15; FQueueAutoPopup = true; FSessionRememberPassword = false; UnicodeString ProgramsFolder; SpecialFolderLocation(CSIDL_PROGRAM_FILES, ProgramsFolder); FDefaultPuttyPathOnly = IncludeTrailingBackslash(ProgramsFolder) + L"PuTTY\\" + OriginalPuttyExecutable; FDefaultPuttyPath = L"%PROGRAMFILES%\\PuTTY\\" + OriginalPuttyExecutable; FPuttyPath = FormatCommand(FDefaultPuttyPath, L""); PSftpPath = FormatCommand(L"%PROGRAMFILES%\\PuTTY\\psftp.exe", L""); FPuttyPassword = false; FTelnetForFtpInPutty = true; FPuttySession = L"WinSCP temporary session"; FBeepOnFinish = false; FBeepOnFinishAfter = TDateTime(0, 0, 30, 0); FCopyParamCurrent = L""; FKeepUpToDateChangeDelay = 500; FChecksumAlg = L"md5"; FSessionReopenAutoIdle = 9000; FNewDirectoryProperties.Default(); FNewDirectoryProperties.Rights = TRights::rfDefault | TRights::rfExec; }
/* returns: FALSE - request should be deleted, TRUE - keep request */ int CProcessor::ProcessSingleRequest(Request *req) { UserInfo user = {0}; ConGroup group = {0}; double prices[2]; CharString str, strMsg; char strCmd[64], strType[64]; user.login = m_manager; COPY_STR(user.name, "Virtual Dealer"); COPY_STR(user.ip, "VirtualDealer"); ExtServer->GroupsGet(req->group, &group); // получим текущие цены для группы и установки символа if (ExtServer->HistoryPricesGroup(req->trans.symbol, &group, prices) != RET_OK) { ExtServer->RequestsReset(req->id, &user, DC_RESETED); str.Printf(FALSE, "ProcessSingleRequest: HistoryPricesGroup (symbol [%s], group [%s]) failed", req->trans.symbol, req->group); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray()); return FALSE; } // если это запрос на открытие позы... if (req->trans.type == TT_ORDER_IE_OPEN || req->trans.type == TT_ORDER_IE_CLOSE || req->trans.type == TT_ORDER_MK_OPEN || req->trans.type == TT_ORDER_MK_CLOSE) { // запрос был отправлен, ответа нет - таймаут if (req->sent && (GetTickCount() > req->time + m_waitForFXIReply)) { str.Printf(FALSE, "Таймаут для запроса %d (нет ответа от сервера FXI)", req->id); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray()); // !! добавить открытие сделки (отложенное) ExtServer->RequestsRequote(req->id, &user, prices, FALSE); return FALSE; } // запрос к FXI еще не был отправлен - отправить if (!req->sent) { ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Отправка UDP"); CharString reqStr; reqStr.Printf(FALSE, "requestId=%d;group=%s;time=%d;login=%d;", req->id, req->group, req->time, req->login); reqStr.Printf(TRUE, "type=%s;side=%d;order=%d;orderby=%d;price=%g;symbol=%s;volume=%d;tp=%g;sl=%g;slippage=%d;pending=%d;stopout=%d", req->trans.type == TT_ORDER_IE_OPEN || req->trans.type == TT_ORDER_MK_OPEN ? "OPEN" : "CLOSE", req->trans.cmd == OP_BUY || req->trans.cmd == OP_BUY_LIMIT || req->trans.cmd == OP_BUY_STOP ? FXI_OP_BUY : FXI_OP_SELL, req->trans.order, req->trans.orderby, req->trans.price, req->trans.symbol, req->trans.volume, req->trans.tp, req->trans.sl, req->trans.ie_deviation, req->isPending, req->isStopout); FormatCommand(req->trans.cmd, strCmd); FormatRequestType(req->trans.type, strType); str.Printf(FALSE, "Отправка запроса FXI [%s] типа [%s] по цене [%g], ордер [%d]", strCmd, strType, req->trans.price, req->trans.order); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray()); m_sender->SendTo(&reqStr, m_sendHost, m_sendPort); req->sent = TRUE; ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Отправка UDP::OK"); return TRUE; } Response resp = { 0 }; int requestId = req->trans.type == TT_ORDER_MK_CLOSE || req->trans.type == TT_ORDER_IE_CLOSE ? req->trans.order : req->id; int respFound = extQueue->FindAndDequeue(requestId, &resp); if (!respFound) return TRUE; // получен ответ от FXI ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Обработка ответа FXI"); // обработан успешно if (resp.status == RequestCompleted) { strMsg.Printf(FALSE, "Запрос (%d) подтвержден по цене (%g), сейчас цена (%g)", req->id, req->trans.cmd == OP_BUY ? prices[1] : prices[0], resp.price); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, strMsg.ToArray()); double newPrices[2] = { resp.price, resp.price }; req->trans.price = resp.price; // отложенный ордер if (resp.isPendingActivate) { ActivatePendingOrder(&resp); return FALSE; } // обработка ответа на закрытие (стопаут) if (resp.isStopoutReply) { ClosePositionStopout(&resp, req); return FALSE; } // обычный ордер // подтвердить запрос if (ExtServer->RequestsConfirm(req->id, &user, newPrices) == RET_OK) { // если запрос на открытие... if (req->trans.type == TT_ORDER_IE_OPEN || req->trans.type == TT_ORDER_MK_OPEN) // сохранить подтвержденный запрос (потом ассоциировать его с открывшейся // позицией) extPendingRequestQueue.AddRequest(resp.requestId, req->login, req->trans.cmd, req->trans.symbol, req->trans.volume, resp.price); } else { // сделка открыта у брокера, но не открылась в МТ4 } return FALSE; } // обработан с ошибкой if (resp.status == RequestFailed) { ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Запрос не подтвержден (отрицательная квитанция)"); ExtServer->RequestsReset(req->id, &user, DC_RESETED); return FALSE; } // прочие возвраты strMsg.Printf(FALSE, "Запрос: код ответа [%d]", resp.status); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, strMsg.ToArray()); return FALSE; } // if (req->trans.type == TT_ORDER_IE_OPEN ... // запрос цены, не более if (req->trans.type == TT_PRICES_GET) { ExtServer->RequestsPrices(req->id, &user, prices, FALSE); return FALSE; } if (req->trans.type == TT_ORDER_DELETE) { ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Удаление отложенного ордера"); ExtServer->RequestsConfirm(req->id, &user, prices); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Отложенный ордер удален"); return FALSE; } // остальные запросы подтверждаем ExtServer->RequestsConfirm(req->id, &user, prices); return FALSE; }
int CProcessor::Add(const UserInfo *user, const ConGroup *group, const ConSymbol *symbol, const TradeRecord *pending, TradeRecord *trade) { Request *temp; UINT id; static int uid = 1; CharString str; if (pending == NULL || trade == NULL) return(FALSE); // проверки - кто управляет счетом if (m_delay == 0 || CheckGroup(m_groups, group->group) == FALSE) return (TRUE); double prices[2]; // получим текущие цены для группы и установки символа if (ExtServer->HistoryPricesGroup(symbol->symbol, group, prices) != RET_OK) { str.Printf(FALSE, "CProcessor::Add Pending (symbol [%s], group [%s]) failed", symbol->symbol, group->group); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray()); return FALSE; } m_sync.Lock(); // проверить - нет ли такого запроса в списке Request *reqTmp; if (m_requests != NULL) { int i = 0; for (reqTmp = m_requests; i < m_requests_total; i++, reqTmp++) { if (reqTmp->isPending) if (reqTmp->pendingId == pending->order) { ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, "Отложенный ордер уже в списке"); m_sync.Unlock(); return (TRUE); } } } // лог /*char reqCmdStr[64]; FormatCommand(pending->cmd, reqCmdStr); str.Printf(FALSE, "CProcessor::Add Pending(order [%d], cmd [%s], req Id [%d])", pending->order, reqCmdStr, startPendingRequestId); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray());*/ //---- если место для запросов нет выделим if(m_requests == NULL) { if((m_requests = new Request[256]) == NULL) { m_sync.Unlock(); return (FALSE); } m_requests_max = 256; m_requests_total = 0; } //---- посмотрим может надо перевыделить if (m_requests_total >= m_requests_max) { if((temp = new Request[m_requests_max + 256]) == NULL) { m_sync.Unlock(); return(FALSE); } //---- скопируем старое memcpy(temp, m_requests, sizeof(Request) * m_requests_total); //---- удалим уже не нужное delete m_requests; m_requests = temp; m_requests_max += 256; } //---- вставляем запрос m_requests[m_requests_total].pendingId = pending->order; m_requests[m_requests_total].isPending = TRUE; m_requests[m_requests_total].id = startPendingRequestId++; m_requests[m_requests_total].time = GetTickCount(); m_requests[m_requests_total].sent = FALSE; m_requests[m_requests_total].login = user->login; memcpy(&m_requests[m_requests_total].trans, pending, sizeof(TradeTransInfo)); m_requests[m_requests_total].trans.volume = trade->volume; Out(CmdOK, "Pending order %d added of volume %d", m_requests[m_requests_total].id, trade->volume); COPY_STR(m_requests[m_requests_total].group, group->group); // поправить команду char origTradeCmd[32], newTradeCmd[32]; FormatCommand(m_requests[m_requests_total].trans.cmd, origTradeCmd); int pendCmd = trade->cmd; //m_requests[m_requests_total].trans.cmd; pendCmd = (pendCmd == OP_BUY_LIMIT || pendCmd == OP_BUY_STOP) ? OP_BUY : (pendCmd == OP_SELL_LIMIT || pendCmd == OP_SELL_STOP) ? OP_SELL : pendCmd; m_requests[m_requests_total].trans.cmd = pendCmd; FormatCommand(m_requests[m_requests_total].trans.cmd, newTradeCmd); m_requests[m_requests_total].trans.type = TT_ORDER_MK_OPEN; m_requests[m_requests_total].trans.price = pendCmd == OP_BUY ? prices[1] : prices[0]; strcpy(m_requests[m_requests_total].trans.symbol, symbol->symbol); m_requests[m_requests_total].trans.order = pending->order; str.Printf(FALSE, "Отложенный ордер %d добавлен, всего %d (%s, теперь %s)", pending->order, m_requests_total, origTradeCmd, newTradeCmd); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray()); m_requests_total++; //---- запускаем поток if (m_thread == NULL) if ((m_thread = (HANDLE)_beginthreadex(NULL, 256000, ThreadFunction, this, 0, &id))==NULL) { m_sync.Unlock(); return(FALSE); } m_sync.Unlock(); return(TRUE); }
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CProcessor::Add(RequestInfo *request, int isStopout) { Request *temp; UINT id; Request req = {0}; static int uid = 1; if (request == NULL) return(FALSE); // проверки - кто управляет счетом if (m_delay == 0 || CheckGroup(m_groups, request->group) == FALSE) return (TRUE); // лог char reqTypeStr[64]; char reqCmdStr[64]; FormatCommand(request->trade.cmd, reqCmdStr); FormatRequestType(request->trade.type, reqTypeStr); CharString str; str.Printf(FALSE, "CProcessor::Add(тип [%s], cmd [%s])", reqTypeStr, reqCmdStr); ExtServer->LogsOut(CmdOK, PROGRAM_TITLE, str.ToArray()); m_sync.Lock(); //---- если место для запросов нет выделим if(m_requests == NULL) { if((m_requests = new Request[256]) == NULL) { m_sync.Unlock(); return (FALSE); } m_requests_max = 256; m_requests_total = 0; } //---- посмотрим может надо перевыделить if (m_requests_total >= m_requests_max) { if((temp = new Request[m_requests_max + 256]) == NULL) { m_sync.Unlock(); return(FALSE); } //---- скопируем старое memcpy(temp, m_requests, sizeof(Request) * m_requests_total); //---- удалим уже не нужное delete m_requests; m_requests = temp; m_requests_max += 256; } //---- вставляем запрос m_requests[m_requests_total].isStopout = isStopout; m_requests[m_requests_total].isPending = FALSE; m_requests[m_requests_total].id = request->id; m_requests[m_requests_total].time = GetTickCount(); m_requests[m_requests_total].sent = FALSE; m_requests[m_requests_total].login = request->login; memcpy(&m_requests[m_requests_total].trans, &request->trade, sizeof(TradeTransInfo)); COPY_STR(m_requests[m_requests_total].group, request->group); m_requests_total++; //---- запускаем поток if (m_thread == NULL) if ((m_thread = (HANDLE)_beginthreadex(NULL, 256000, ThreadFunction, this, 0, &id))==NULL) { m_sync.Unlock(); return(FALSE); } m_sync.Unlock(); return(TRUE); }
void ConsoleController::EvaluateCommand(std::string command) { consoleModel->ProcessResult(command, FormatCommand(command), commandInterface->Command(command)); }